根据 json 值实例化 class

Instantiate class based on json value

假设我有两个 classes :

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数据并根据人的性别实例化相应的class。

例如:

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

这可以验证,但我无法遍历对象并为实例化的 class 提供 属性 值,如下所示:

foreach(var key in person) {
   myObject[key] = person[key];
}

我收到错误:

Cannot apply indexing with [] to an expression of type object.

这让我认为我必须将 myObject 转换为合适的类型,但如何转换?

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

但我认为更好的答案是您可能应该重新设计 classes。 malefemale 可以是 Person class 和 gender 属性 以及 nameage -- 与 JSON 中的完全一样。

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