我正在针对List<ExpandoObject>
创建List<SomeClassA>
。即,使用expadoObject动态创建对象,并向其添加属性。我可以轻松获得所需的输出,但如果List<SomeClassA>
具有一些复杂的属性,即Address
字段等,我的解决方案将失败(对于示例
class SomeClassA
{
string Name { get; set; }
string Age { get; set; }
Address address { get; set; }
}
class Address
{
string house { get; set; }
string city { get; set; }
}
对于List<SomeClassA>
中的任何项目,我必须拥有address.house
这样的属性。因为我在循环中,要映射的属性可以是简单的,也可以是复杂的(如地址)。为了解决这个问题,我应用了一个检查来知道它是否是嵌套属性,并将新的expanoObject创建为动态的,而不是简单的属性。类似的东西:
//assume:
string name = classAobj.Name; string address = classAobj.Address;
dynamic dynObj = new ExpandoObject();
var prop = dynObj as IDictionary<string, object>;
在循环中,如果属性很简单(例如,名称):
prop[name] = classAobj.GetType().GetProperty("Name").GetValue(classAobj);
如果属性很复杂(例如,地址):
prop[address] = new ExpandoObject() as dynamic;
//then add its properties. but can't
我被困的地方是,我无法参考这一点:prop[address]
问题是:如何访问此点并动态添加属性(即房屋,城市)。
PropertyInfro x = prop.GetType().GetProperty(address);
或FieldInfo f = prop.GetType().GetField(address);
返回null。虽然我可以在调试模式下将其视为new ExpandoObject
。
问题摘要:我如何引用动态创建的嵌套 ExpandoObject,并为其添加属性。我将简单属性添加到外部对象的方式。 我经历过几篇SO帖子,但没有任何帮助,因为情景总是不同。
答案 0 :(得分:0)
我明白了。而不是PropertyInfro x = prop.GetType().GetProperty(address);
,只需使用prop[address]
就足以供参考。所以,以下是它的工作原理。
dynamic complexProp = prop[address];
var innerProp = complexProp as IDictionary<string, object>;
innerProp[house] = "some value";
innerProp[city] = "some value";