获取对内部动态expandoobject属性的引用并为其添加新属性

时间:2014-12-10 09:14:04

标签: c# dynamic reflection expandoobject

我正在针对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 ExpandoObjectDebugging mode: assume 10th location is address

问题摘要:我如何引用动态创建的嵌套 ExpandoObject,并为其添加属性。我将简单属性添加到外部对象的方式。 我经历过几篇SO帖子,但没有任何帮助,因为情景总是不同。

1 个答案:

答案 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";