C# 基于json值实例化类

C# 基于json值实例化类,c#,casting,activator,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" : [ {

假设我有两门课:

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"
        }   
    ]
}
foreach(var key in person) {
   myObject[key] = person[key];
}
我希望遍历这个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
}
这将进行验证,但我无法循环对象并为实例化的类提供如下属性值:

{
    "people" : [
        {
            "name" : "fred",
            "age" : 45,
            "gender" : "male"
        },
        {
            "name" : "jane",
            "age" : 45,
            "gender" : "female"
        }   
    ]
}
foreach(var key in person) {
   myObject[key] = person[key];
}
我得到一个错误:

无法将带[]的索引应用于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]);
    }
}

但我认为更好的答案是,您可能应该重新设计您的类
男性
女性
可以是一个
类,具有
性别
属性以及
姓名
年龄
——与JSON中的完全相同

传统的JSON序列化并没有被打破。真的有迫切的需要重新发明它吗

在C#中,对象不是其属性的关联数组。这就是JavaScript。如果确实需要这样做,请使用反射来设置属性

大概是这样的:

PropertyInfo[] props = myObject.GetType().GetProperties();

foreach (var propInfo in props)
{
    if (person.ContainsKey(propInfo.Name))
    {
        propInfo.SetValue(myObject, person[propInfo.Name]);
    }
}

但我认为更好的答案是,您可能应该重新设计您的类
男性
女性
可以是一个
类,具有
性别
属性以及
姓名
年龄
——与JSON中的完全相同



传统的JSON序列化并没有被打破。真的有迫切的需要重新发明它吗

这两个类完全相同,为什么它们是两个不同的类?@maccettura这只是一个例子,我的类在我的实际生活中是不同的project@maccettura这与问题无关。可能还有其他属性没有显示出来进行简化。@Juanferer我认为这一点都不重要,这很可能是一个类设计问题。另一种选择是使用反射,这在大多数情况下都不是最好的想法。@Thaneogy我认为你的问题可能有一个更简单的解决方案。如果有可能的话,可以看到更多的类代码。这两个类完全相同,那么为什么它们是两个不同的类呢?@maccettura这只是一个例子,我的类在实际应用中是不同的project@maccettura这与问题无关。可能还有其他属性没有显示出来进行简化。@Juanferer我认为这一点都不重要,这很可能是一个类设计问题。另一种选择是使用反射,这在大多数情况下都不是最好的想法。@Thaneogy我认为你的问题可能有一个更简单的解决方案。如果有可能的话,可以看到更多的类代码。正如你所说的,我对Javascript更为熟悉。我知道你的例子,“person”必须是什么类型才能有“ContainsKey”?我认为
person
应该是一本
字典,如果我错了请纠正我是的,我猜
person
是一个
dynamic
支持
IDictionary
@that的东西,如果它没有,我只是更新了一个不使用它的版本。正如你所说的,我更熟悉Javascript。我知道你的例子,“person”必须是什么类型才能有“ContainsKey”?我认为
person
应该是一本
字典,如果我错了请纠正我是的,我猜
person
是一个
dynamic
支持
IDictionary
@的东西,如果没有,我只是更新了一个不使用它的版本。