【问题标题】:Get reference to inner dynamic expandoobject property and add new property for it获取对内部动态 expandoobject 属性的引用并为其添加新属性
【发布时间】:2014-12-10 09:14:03
【问题描述】:

我正在创建 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。

问题总结:如何引用动态创建的nested ExpandoObject,并为其添加属性。我向外部对象添加简单属性的方式。 我浏览过几篇 SO 帖子,但没有任何帮助,因为场景总是不同的。

【问题讨论】:

  • 你的问题是how to add properties to a dynamic object at runtime吗?如果不是,您能否尝试重新格式化您的问题,因为您的实际问题至少对我来说不是很清楚。
  • 那么当您尝试prop[address].house = "foo"; 时会发生什么?
  • @Selman22 编译器说object doesn't contain definition for house....
  • @CodeCaster 不,这不是我的问题。如果您在附加图像中看到,道具是一个扩展对象,我是动态创建的。从 1 到 9 的元素是我添加到 expandoObject 的属性。第 10 个元素是一个 expandoObject,在另一个 exendoObject 旁边(想想 classA 中的地址)。现在我想为这个内部对象设置属性。怎么参考?

标签: c# dynamic reflection expandoobject


【解决方案1】:

我想通了。而不是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";

【讨论】:

  • 将 complexProp 转换为 IDictionary 失败。所以这不起作用
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 2012-03-22
  • 2022-09-27
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多