基于json值实例化类

时间:2017-06-29 14:22:18

标签: c# casting activator

说我有两个班级:

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强制转换为合适的类型,但是如何?

1 个答案:

答案 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]);
    }
}

但我认为更好的答案是你应该重新设计你的课程。 malefemale可以是一个Person类,其gender属性以及nameage - 与JSON中的内容完全相同。

传统的JSON序列化没有被破坏。是否真的迫切需要重塑它?