Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用字典中的DataContract创建.NET对象_C#_Datacontractserializer_Datacontract_Javascriptserializer - Fatal编程技术网

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);