C# 使用字典中的DataContract创建.NET对象
具有定义的类:C# 使用字典中的DataContract创建.NET对象,c#,datacontractserializer,datacontract,javascriptserializer,C#,Datacontractserializer,Datacontract,Javascriptserializer,具有定义的类: [DataContract] public class Command { [DataMember(Name = "cmdName")] public string CommandName { get; set; } [DataMember(Name = "cmdTransactionId")] public string CommandTransactionId { get; set; } } 我想从字典中创建
[DataContract]
public class Command
{
[DataMember(Name = "cmdName")]
public string CommandName { get; set; }
[DataMember(Name = "cmdTransactionId")]
public string CommandTransactionId { get; set; }
}
我想从字典中创建该类的实例:
Dictionary<string, object> propertyBag = new Dictionary<string, object>();
propertyBag["cmdName"] = "cmd1";
propertyBag["cmdTransactionId"] = "1";
Command command = deserializer.Create<Command>(propertyBag);
Dictionary propertyBag=new Dictionary();
propertyBag[“cmdName”]=“cmd1”;
propertyBag[“cmdTransactionId”]=“1”;
Command=deserializer.Create(propertyBag);
DataContractSerializer
对我来说不起作用,JavaScriptSerializer.ConvertToType
也不起作用,因为它们中的每一个都缺少阻止我一次创建对象的部分。也许你可以将此代码用于反序列化程序。创建(propertyBag)
:
public T创建(IDictionary propertyBag)
{
var result=(T)FormatterServices.GetUninitializedObject(typeof(T));
foreach(typeof(T).GetMembers()中from成员中的var项)
让dataMemberAttr=member.GetCustomAttributes(typeof(DataMemberAttribute),true).Cast().SingleOrDefault()
其中dataMemberAttr!=null&&propertyBag.ContainsKey(dataMemberAttr.Name)
选择新{Member=Member,Value=propertyBag[dataMemberAttr.Name]})
{
var property=item.Member作为PropertyInfo;
if(属性!=null)
{
属性.SetValue(结果,项.Value,null);
继续;
}
变量字段=项。成员作为字段信息;
如果(字段!=null)
{
字段.SetValue(结果,项.Value);
继续;
}
}
返回结果;
}
此代码未经测试-仅在此处键入。
JavaScriptSerializer
将在此处工作,但需要进行一些更改:
var propertyBag = new Dictionary<string, object>();
propertyBag["CommandName"] = "cmd1";
propertyBag["CommandTransactionId"] = "1";
var serializer = new JavaScriptSerializer();
var res = serializer.Serialize(propertyBag);
var command = serializer.Deserialize<Command>(res);
var-propertyBag=new Dictionary();
propertyBag[“CommandName”]=“cmd1”;
propertyBag[“CommandTransactionId”]=“1”;
var serializer=新的JavaScriptSerializer();
var res=serializer.Serialize(propertyBag);
var命令=序列化程序。反序列化(res);
我使用了
反序列化
方法,而不是ConvertToType
one。第二个差异更为显著。我使用的字典包含与Command
类中的属性名称相同的键。如果您不喜欢它,您应该尝试编写一个定制的JavaScriptConverter
。看看这个。你能不能使用var command=newcommand{CommandName=“cmd1”,CommandTransactionId=“1”}代码>?这大大简化了(只是一个示例),我有30个DataContract类和300个这样的属性。例如,我可以使用JsonProperty而不是DataMember。我可能首先尝试的是使用属性字典。将这些“对象”转换为JSON字符串。然后将该JSON字符串转换为实际的对象类。使用这种模式,您基本上是通过API或表单数据重新创建JSON的客户端到服务器行为?A不包含方法Create
。反序列化程序只是一个我正在寻找替换的模拟程序。您是否尝试使用我提出的问题中提出的解决方案?在我看来,它们不需要重命名键或属性。我无法更改propertyBag字典中的键(它们由我无法控制的其他组件生成),因此这对我不起作用(“cmdName”!=“CommandName”)。我也不能重命名我的属性。
var propertyBag = new Dictionary<string, object>();
propertyBag["CommandName"] = "cmd1";
propertyBag["CommandTransactionId"] = "1";
var serializer = new JavaScriptSerializer();
var res = serializer.Serialize(propertyBag);
var command = serializer.Deserialize<Command>(res);