Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将存储为ParseObject的记录转换为子类_C#_Csv_Subclassing - Fatal编程技术网

C# 将存储为ParseObject的记录转换为子类

C# 将存储为ParseObject的记录转换为子类,c#,csv,subclassing,C#,Csv,Subclassing,我已将CSV文件导入我的解析应用程序。我希望能够将表中的记录作为ParseObject的子类类型进行访问。我可以获取表格,并且可以使用myRecord.get(“MyField”)从记录中获取值。我更喜欢通过子类上的属性获取字段 FWIW,我的客户端是Unity桌面应用程序 为了说明我的目标: [ParseClassName( "MyRecord" )] public class MyRecord: ParseObject { [ParseFieldName( "MyField" )]

我已将CSV文件导入我的解析应用程序。我希望能够将表中的记录作为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?
    } );
}
[ParseClassName(“MyRecord”)]
公共类MyRecord:ParseObject
{
[ParseFieldName(“MyField”)]
公共字符串MyField
{
获取{return GetProperty(“MyField”);}
集合{SetProperty(值,“MyField”);}
}
//....
}
//其他地方。。。
void示例()
{
var query=new ParseQuery();
query.FindAsync().ContinueWith(t=>
{
var anObj=t.Result.First();//anObj是ParseObject类型
var a=anObj.Get(“MyField”);//工作正常
//不知怎的把anObj改写成了MyRecord
var b=myRecord.MyField;//我该怎么做?
} );
}
这可能吗

[编辑]

关于铸造anObj的想法:铸造将失败,因为anObj实际上不是MyRecord类型


我对问题根源的理解是,在我将CVS文件导入Parse时,Parse不知道行可以映射到MyRecord,因此它将行创建为普通的ParseObject实例,并将列内置到其字典中。我认为Parse子类化的核心是一种将属性包装为字典访问器的技术。我希望(虽然不是真的期望)解析提供了一种在事后进行绑定的本机方法。

我认为这里没有实际的对象继承关系,否则执行强制转换就可以了

我可以想到三种选择(如果我对没有继承的看法是正确的话)

  • 使用将属性复制到具有额外属性的类型 汽车制造商
  • 将基对象传递给实现 附加属性
  • 将扩展方法生成为您拥有的类型
  • (一) 基本上是这样创造的:

    var myRecord = AutoMapper.Map<MyRecord, ParseObject>(anObj);
    // Then access properties on myRecord like you wanted, so myRecord.MyField
    
    (三) 创建一个名为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" );
      }
    
    }
    
    公共静态类MyRecordExtensions
    {
    公共静态字符串GetMyField(此ParseObject ParseObject)
    {
    返回GetProperty(“MyField”);
    }
    //不确定你是否需要二传手,只是以防万一
    公共静态void SetMyField(此ParseObject ParseObject,字符串newValue)
    {
    SetProperty(新值,“MyField”);
    }
    }
    

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

    好吧。看来我把事情弄得比实际情况复杂得多。(这就是在DB上松开DB naif的结果。:})

    我的错误印象是,我的查询返回的是一个装有我收藏的容器,而不是收藏本身。当我查询MyRecord时,我得到了一个实际上是MyRecord类型的集合,这就是我最初想要的


    谢谢你提供的帮助

    如果您将其转换为MyRecord,是否会出现错误?例如:MyRecord rec=(MyRecord)anObj如果是,您可以编辑您的问题以添加您得到的错误吗?是的,这很接近,谢谢。:)我已经详细阐述了这个问题。理想情况下,我能够让Parse在导入时绑定行,这样它就可以创建一个MyRecord表而不是ParseObject。其次是Parse知道如何在事后重新绑定。实际上,我正在按照你的#2战略做一些事情#1看起来更优雅。我以前不熟悉AutoMapper,所以也非常感谢。
    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" );
      }
    
    }