我有一个包含称为“任务”的业务实体的应用程序。该实体具有一组固定的属性,但也具有充当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"
}
}
当然,当我尝试从ANOTHER程序查询此数据存储时,它会尝试查找包含int和字符串的匿名类型。另一个程序是最初保存文档的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;
}
}
最佳答案
在这种情况下,最好避免使用dynamic
。如果改用Dictionary<string, object>
,则创建Task
不会太可怕:
new RavenResearch.Task {
TaskId = Guid.NewGuid(),
CreatedDate = DateTime.Now,
DynamicProperties = new Dictionary<string, object> {
{ "MatterNumber", 0 },
{ "CustomerNumber", "37" }
}
}