将存储为 ParseObject 的记录转换为子类
Converting a record stored as a ParseObject to a subclass
我已将 CSV 文件导入到我的 Parse 应用程序中。我希望能够从 table 作为 ParseObject 的子类类型访问记录。我可以获得 table,并且我可以使用例如从记录中获取值myRecord.Get("MyField")。我更愿意通过子类的属性获取字段。
FWIW,我的客户端是一个 Unity 桌面应用程序。
为了说明我所追求的:
[ParseClassName( "MyRecord" )]
public class MyRecord: ParseObject
{
[ParseFieldName( "MyField" )]
public string MyField
{
get { return GetProperty<string>( "MyField" ); }
set { SetProperty<string>( value, "MyField" ); }
}
//....
}
// elsewhere...
void Example()
{
var query = new ParseQuery<MyTable>();
query.FindAsync().ContinueWith( t =>
{
var anObj = t.Result.First(); // anObj is type ParseObject
var a = anObj.Get<string>( "MyField" ); // works fine
// somehow recast anObj to a MyRecord
var b = myRecord.MyField; // How do I get to this?
} );
}
这可能吗?
[编辑]
关于转换 anObj 的想法:转换将失败,因为 anObj 实际上不是 MyRecord 类型。
我对问题根源的理解是,当我将 CVS 文件导入 Parse 时,Parse 不知道行可以映射到 MyRecord,因此它将行创建为带有构建列的普通 ParseObject 实例入其辞典。我认为 Parse 子类化的核心是一种将属性包装为字典访问器的技术。我希望(虽然不是真的期待)Parse 提供了一种本地方式来在事后进行绑定。
我假设这里没有实际的对象继承关系,否则进行转换就可以了。
我可以想到三个选项(如果我对没有继承的看法是对的)。
- 将属性复制到具有额外属性的类型,使用
自动映射器
- 将基础对象传递到实现类型的构造函数中
附加属性
- 为您拥有的类型构建扩展方法
1)
本质上是这样创建的:
var myRecord = AutoMapper.Map<MyRecord, ParseObject>(anObj);
// Then access properties on myRecord like you wanted, so myRecord.MyField
2)
var myRecord = new MyRecord(anObj);
// Then access properties on myRecord like you wanted, so myRecord.MyField, but you will need to copy all pertinent values yourself in the constructor
3)
像这样创建一个名为 MyRecordExtensions 的新类型:
public static class MyRecordExtensions
{
public static string GetMyField(this ParseObject parseObject)
{
return GetProperty<string>( "MyField" );
}
// Not sure if you need the setters at all, but just in case
public static void SetMyField(this ParseObject parseObject, string newValue)
{
SetProperty<string>( newValue, "MyField" );
}
}
希望我更接近你的问题:)
嗯。看来我使这件事比实际情况要复杂得多。 (这就是将 DB naif 在 DB 上松散的结果。:})
我误以为我的查询返回的是一个装有 collection 的容器,而不是 collection 本身。当我查询 MyRecord 时,我得到一个实际上属于 MyRecord 类型的 collection,这正是我最初想要的。
感谢您提供的帮助!
我已将 CSV 文件导入到我的 Parse 应用程序中。我希望能够从 table 作为 ParseObject 的子类类型访问记录。我可以获得 table,并且我可以使用例如从记录中获取值myRecord.Get("MyField")。我更愿意通过子类的属性获取字段。
FWIW,我的客户端是一个 Unity 桌面应用程序。
为了说明我所追求的:
[ParseClassName( "MyRecord" )]
public class MyRecord: ParseObject
{
[ParseFieldName( "MyField" )]
public string MyField
{
get { return GetProperty<string>( "MyField" ); }
set { SetProperty<string>( value, "MyField" ); }
}
//....
}
// elsewhere...
void Example()
{
var query = new ParseQuery<MyTable>();
query.FindAsync().ContinueWith( t =>
{
var anObj = t.Result.First(); // anObj is type ParseObject
var a = anObj.Get<string>( "MyField" ); // works fine
// somehow recast anObj to a MyRecord
var b = myRecord.MyField; // How do I get to this?
} );
}
这可能吗?
[编辑]
关于转换 anObj 的想法:转换将失败,因为 anObj 实际上不是 MyRecord 类型。
我对问题根源的理解是,当我将 CVS 文件导入 Parse 时,Parse 不知道行可以映射到 MyRecord,因此它将行创建为带有构建列的普通 ParseObject 实例入其辞典。我认为 Parse 子类化的核心是一种将属性包装为字典访问器的技术。我希望(虽然不是真的期待)Parse 提供了一种本地方式来在事后进行绑定。
我假设这里没有实际的对象继承关系,否则进行转换就可以了。
我可以想到三个选项(如果我对没有继承的看法是对的)。
- 将属性复制到具有额外属性的类型,使用 自动映射器
- 将基础对象传递到实现类型的构造函数中 附加属性
- 为您拥有的类型构建扩展方法
1) 本质上是这样创建的:
var myRecord = AutoMapper.Map<MyRecord, ParseObject>(anObj);
// Then access properties on myRecord like you wanted, so myRecord.MyField
2)
var myRecord = new MyRecord(anObj);
// Then access properties on myRecord like you wanted, so myRecord.MyField, but you will need to copy all pertinent values yourself in the constructor
3) 像这样创建一个名为 MyRecordExtensions 的新类型:
public static class MyRecordExtensions
{
public static string GetMyField(this ParseObject parseObject)
{
return GetProperty<string>( "MyField" );
}
// Not sure if you need the setters at all, but just in case
public static void SetMyField(this ParseObject parseObject, string newValue)
{
SetProperty<string>( newValue, "MyField" );
}
}
希望我更接近你的问题:)
嗯。看来我使这件事比实际情况要复杂得多。 (这就是将 DB naif 在 DB 上松散的结果。:})
我误以为我的查询返回的是一个装有 collection 的容器,而不是 collection 本身。当我查询 MyRecord 时,我得到一个实际上属于 MyRecord 类型的 collection,这正是我最初想要的。
感谢您提供的帮助!