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

标签 c# json ravendb expando

我有一个应用程序,其中包含一个名为“任务”的业务实体。该实体具有一组固定的属性,但也具有作为 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 和字符串的匿名类型。那个其他程序是最初保存文档的 EXE - 我不想引用它。

提取动态属性的最佳方法是什么?我的目标是能够从 Raven 查询 Task 对象的列表,并将它们传递给 Xaml 以在 UI 中呈现——这就是为什么数据绑定(bind)到 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;
    }
}

最佳答案

请记住,在运行时,dynamic 只是对象,我们无法知道您在那里的实际含义。 在那里使用 RavenJObject 可能会更好。这将是处理动态数据的一种更自然的方式,并且它将保留类型信息

关于c# - 将匿名类型反序列化为动态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7507660/

相关文章:

c# - 使用 LINQ 嵌套查询获取更新的最新行

c# - 从 ASP.NET Controller 返回动态 jsonobject

c# - ASP.NET MVC5 自定义 AuthorizeAttribute 未被正确调用

c# - 使用 NEST C# 客户端的 ElasticSearch 重音不敏感查询

Javascript 数据存入表

java - Apache Camel - 向路由发送消息后的响应

c# - 使用 RavenDB 持久性插件连接 JOliver 的 EventStore

nuget - RavenDB和SignalR Nuget包依赖关系冲突

RavenDB 推送通知 : Actual document not included?

c# - Linq for rank() 在 SQL Server 中等效 -