【发布时间】: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