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
@的东西,如果没有,我只是更新了一个不使用它的版本。