【问题标题】:Converting a record stored as a ParseObject to a subclass将存储为 ParseObject 的记录转换为子类
【发布时间】:2015-12-11 01:59:21
【问题描述】:

我已将 CSV 文件导入我的 Parse 应用程序。我希望能够将表中的记录作为 ParseObject 的子类来访问。我可以获取表格,并且可以使用例如从记录中获取值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 提供了一种在事后进行绑定的本地方式。

【问题讨论】:

  • 如果将其转换为 MyRecord,是否会出现错误?例如:MyRecord rec = (MyRecord)anObj 如果可以,您可以编辑您的问题以添加您得到的错误吗?

标签: c# csv subclassing


【解决方案1】:

我认为这里没有实际的对象继承关系,否则进行强制转换会起作用。

我能想到三个选项(如果我对没有继承的看法是正确的)。

  1. 将属性复制到具有额外属性的类型,使用 自动映射器
  2. 将基础对象传递给实现类型的构造函数 其他属性
  3. 为您拥有的类型构建扩展方法

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" );
  }

}

希望我更接近你的问题:)

【讨论】:

  • 是的,这很接近,谢谢。 :) 我已经详细阐述了这个问题。理想情况下,我可以让 Parse 在导入时绑定行,以便它创建一个 MyRecord 表而不是 ParseObject。下一个最好的方法是 Parse 知道如何在事后重新绑定。在实践中,我正在按照您的#2 策略做一些事情。 #1 看起来更优雅。我以前不熟悉 AutoMapper,所以也谢谢你。
【解决方案2】:

嗯。看来我做的比实际复杂得多。 (这就是让 DB 天真地放松 DB 的结果。:})

我误以为我的查​​询返回的是一个包含我的集合的容器,而不是集合本身。当我查询 MyRecord 时,我得到了一个实际上是 MyRecord 类型的集合,这就是我最初所追求的。

感谢您提供的帮助!

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多