根据 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。 male
和 female
可以是 Person
class 和 gender
属性 以及 name
和 age
-- 与 JSON 中的完全一样。
常规 JSON 序列化没有被破坏。是否真的有重塑它的迫切需要?
假设我有两个 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。 male
和 female
可以是 Person
class 和 gender
属性 以及 name
和 age
-- 与 JSON 中的完全一样。
常规 JSON 序列化没有被破坏。是否真的有重塑它的迫切需要?