说我有两个班级:
public class male
{
public string name { get; set; }
public int age { get; set; }
}
public class female
{
public string name { get; set; }
public int age { get; set; }
}
我有一些像这样的JSON数据:
{
"people" : [
{
"name" : "fred",
"age" : 45,
"gender" : "male"
},
{
"name" : "jane",
"age" : 45,
"gender" : "female"
}
]
}
我希望遍历此JSON数据,并根据人的性别,实例化相应的类。
例如:
JObject data = jsonData.people;
for(var i = 0; i< data.Count; i++) {
JObject thisPerson = data[i];
var instantiatePerson = new {thisPerson.gender}; //obviously this will not work
}
现在上面只是一个例子,希望能解释我的需要。
我尝试使用Activator.CreateInstance
,如此:
var type = Type.GetType("myNamespace" + person.gender);
var myObject = Activator.CreateInstance(type);
这验证但我无法遍历该对象并为实例化类提供属性值,如下所示:
foreach(var key in person) {
myObject[key] = person[key];
}
我收到错误:
无法将带有[]的索引应用于object类型的表达式。
这让我觉得我必须将myObject强制转换为合适的类型,但是如何?
答案 0 :(得分:2)
在C#中,对象不是其属性的关联数组。这是JavaScript。如果您确实需要以这种方式执行操作,请使用反射来设置属性。
这样的事情:
PropertyInfo[] props = myObject.GetType().GetProperties();
foreach (var propInfo in props)
{
if (person.ContainsKey(propInfo.Name))
{
propInfo.SetValue(myObject, person[propInfo.Name]);
}
}
或
var type = myObject.GetType();
foreach (var key in person) {
var prop = type.GetProperty(key);
if (prop != null)
{
prop.SetValue(myObject, person[key]);
}
}
但我认为更好的答案是你应该重新设计你的课程。 male
和female
可以是一个Person
类,其gender
属性以及name
和age
- 与JSON中的内容完全相同。
传统的JSON序列化没有被破坏。是否真的迫切需要重塑它?