将匿名类型反序列化为动态

时间:2011-09-21 22:48:53

标签: c# json ravendb expando

我的应用程序包含一个名为“Task”的业务实体。该实体具有一组固定的属性,但也具有表现为expando的能力。

因此,它的架构如下所示:

namespace RavenResearch
{
    public class Task
    {
        public Guid TaskId { get; set; }
        public DateTime CreatedDate { get; set; }
        public dynamic DynamicProperties { get; set; }
    }
}

当它存储在RavenDB中时,看起来很喜欢这个

{
  "TaskId": "9cac592f-98ec-4fda-a823-e5402736078e",
  "CreatedDate": "2011-09-22T10:25:35.2701544+12:00",
  "DynamicProperties": {
    "$type": "<>f__AnonymousType0`2[[System.Int32, mscorlib],[System.String, mscorlib]], RavenResearch",
    "MatterNumber": 0,
    "CustomerNumber": "37"
  }
}

当然,当我尝试从另一个程序查询此数据存储区时,它会尝试查找包含int和string的匿名类型。其他程序是最初保存文档的EXE - 我不想参考这个。

提取动态属性的最佳方法是什么?我的目标是能够从Raven查询Task对象列表,并将它们传递给Xaml以便在UI中进行渲染 - 这就是为什么数据绑定到Expando对我很有吸引力,在编译时不需要知道这些属性。

我用这样的语句创建实例(在Raven中存储)

new RavenResearch.Task()
{
    TaskId = Guid.NewGuid(),
    CreatedDate = DateTime.Now,
    DynamicProperties = new 
    {
        MatterNumber = 0,
        CustomerNumber = "37"
    }
}

@Jacob:如果我使用字典,我会丢失有关动态属性的所有类型信息 - 但是,我可以这样做:

public class Task
{
    public Guid TaskId { get; set; }
    public DateTime CreatedDate { get; set; }
    public Dictionary<string, SimpleValue> DynamicProperties { get; set; }
}

public abstract class SimpleValue
{

}

public class SimpleValue<T> : SimpleValue
{
    public T Value
    { get; set; }

    public SimpleValue(T value)
    {
        this.Value = value;
    }
}

2 个答案:

答案 0 :(得分:3)

请记住,在运行时,动态只是对象,我们无法知道你实际意味着什么。 你可能更喜欢在那里使用RavenJObject。这是处理动态数据的一种更自然的方式,它将保留类型信息

答案 1 :(得分:1)

在这种情况下,最好避免使用dynamic。如果您使用Dictionary<string, object>,则创建Task不会太可怕:

new RavenResearch.Task {
    TaskId = Guid.NewGuid(),
    CreatedDate = DateTime.Now,
    DynamicProperties = new Dictionary<string, object> {
        { "MatterNumber", 0 },
        { "CustomerNumber", "37" } 
    }
}