看下面的例子:
void Main()
{
// APPROACH 1: With an anonymous type
var myObject = new {
Property1 = "PropertyValue1"
};
// WORKS: Properties contains "Property1"
var properties = myObject.GetType().GetProperties();
// APPROACH 2: With an expando object
dynamic myObject2 = new ExpandoObject();
myObject2.Property1 = "PropertyValue1";
// DOES NOT WORK: Properties2 is null or empty
var properties2 = myObject2.GetType().GetProperties();
}
我想要的是做Type.GetProperties()
处理动态生成的类型。我真的理解为什么它在方法 1 中有效,而不是在方法 2 中。实际上,在方法 1 中,编译器有机会生成一个看起来与命名类型完全相同的匿名类型。然而,在方法 2 中,编译时类型实际上是 ExpandoObject,因此反射无法正常工作。
如何创建一个动态的运行时对象,并且也可以通过反射正常工作,例如GetProperties
method?
EDIT
感谢您的所有答案,但我真的理解并且知道如何从 ExpandoObject 获取键和值。问题是我需要将动态创建的实例传递给一个方法,该方法超出了我的控制范围,而该方法又会调用实例上的 GetProperties()。
你不需要反思ExpandoObject
。这实际上只是一个奇特的实现IDictionary<string, object>
。您可以将其转换为这样,然后您将拥有一个字典,其中键是属性名称,值是属性值:
// Create your object
dynamic myObject2 = new ExpandoObject();
// Cast to IDictionary<string, object>
var myObjectDictionary = (IDictionary<string, object>)myObject2;
// Get List<string> of properties
var propertyNames = myObjectDictionary.Keys.ToList();
另一种选择是使用IDynamicMetaObjectProvider
, which ExpandoObject
也实现。用法如下:
var metaObjectProvider = (IDynamicMetaObjectProvider)myObject2;
var propertyNames = metaObjectProvider
.GetMetaObject(Expression.Constant(metaObjectProvider))
.GetDynamicMemberNames();
在这种情况下propertyNames
将是一个IEnumerable<string>
与动态成员名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)