C# 将匿名类型反序列化为动态
我有一个应用程序,其中包含一个称为“任务”的业务实体。该实体有一组固定的属性,但也可以作为expando 因此,其模式如下所示:C# 将匿名类型反序列化为动态,c#,json,ravendb,expando,C#,Json,Ravendb,Expando,我有一个应用程序,其中包含一个称为“任务”的业务实体。该实体有一组固定的属性,但也可以作为expando 因此,其模式如下所示: namespace RavenResearch { public class Task { public Guid TaskId { get; set; } public DateTime CreatedDate { get; set; } public dynamic DynamicProperties
namespace RavenResearch
{
public class Task
{
public Guid TaskId { get; set; }
public DateTime CreatedDate { get; set; }
public dynamic DynamicProperties { get; set; }
}
}
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;
}
}
当它存储在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"
}
}
@雅各布:如果我使用字典,我会丢失关于动态属性的所有类型信息-但是,我可以这样做:
namespace RavenResearch
{
public class Task
{
public Guid TaskId { get; set; }
public DateTime CreatedDate { get; set; }
public dynamic DynamicProperties { get; set; }
}
}
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;
}
}
公共类任务
{
公共Guid TaskId{get;set;}
公共日期时间CreatedDate{get;set;}
公共字典动态属性{get;set;}
}
公共抽象类SimpleValue
{
}
公共类SimpleValue:SimpleValue
{
公共价值
{get;set;}
公共SimpleValue(T值)
{
这个。值=值;
}
}
在这种情况下,最好避免使用动态
。如果改用字典
,创建任务
不会太可怕:
new RavenResearch.Task {
TaskId = Guid.NewGuid(),
CreatedDate = DateTime.Now,
DynamicProperties = new Dictionary<string, object> {
{ "MatterNumber", 0 },
{ "CustomerNumber", "37" }
}
}
新RavenResearch.Task{
TaskId=Guid.NewGuid(),
CreatedDate=DateTime。现在,
DynamicProperties=新字典{
{“MatterNumber”,0},
{“客户编号”,“37”}
}
}
在这种情况下,最好避免使用动态
。如果改用字典
,创建任务
不会太可怕:
new RavenResearch.Task {
TaskId = Guid.NewGuid(),
CreatedDate = DateTime.Now,
DynamicProperties = new Dictionary<string, object> {
{ "MatterNumber", 0 },
{ "CustomerNumber", "37" }
}
}
新RavenResearch.Task{
TaskId=Guid.NewGuid(),
CreatedDate=DateTime。现在,
DynamicProperties=新字典{
{“MatterNumber”,0},
{“客户编号”,“37”}
}
}
请记住,在运行时,动态只是一个对象,我们无法知道您的实际意思。
您最好在那里使用RavenJObject。这将是处理动态数据的一种更自然的方式,它将保留类型信息请记住,在运行时,动态只是对象,我们无法知道您在这里的实际含义。
您最好在那里使用RavenJObject。这将是处理动态数据的一种更自然的方式,它将保留类型信息True,但是我会丢失有关MatterNumber和Customer number的所有类型信息。它们仍然是int和string。True,但是我会丢失有关MatterNumber和Customer number的所有类型信息。它们仍然是int和string。