2016-06-27 51 views
1

我有一个库,它依靠它接收的类的PropertyInfo(获取和设置值)进行一堆反射工作。获取动态对象的PropertyInfo

现在我想能够使用动态对象,但我找不到如何获取动态属性的PropertyInfo。我已经检查了替代方案,但对于那些我需要随处更改使用PropertyInfo来获取/设置值的人。

dynamic entity = new ExpandoObject(); 
entity.MyID = 1; 

// - Always null 
PropertyInfo p = entity.GetType().GetProperty("MyID"); 
// - Always null 
PropertyInfo[] ps = entity.GetType().GetProperties(); 

// - These are called everywhere in the code 
object value = p.GetValue(entity); 
p.SetValue(entity, value); 

是否有可能获得或以某种方式创建的PropertyInfo只是为了能够使用它的GetValue()SetValue()动态对象?

+1

我无法重现这一点。你确定属性MyID存在于实体上并且是公共的吗? –

+0

@DavidL对不起,我会发布一个更好的例子。这是一种动态,所以财产只有在已经确定并且是公开的情况下才会存在。 – Danicco

+0

请注意,它可能不是一个实际的属性。通过将运行时绑定重定向到名称/值字典,某些类型像“ExpandoObject”_simulate_属性。 –

回答

0

掩护下一个ExpandoObject实际上只是一个字典。只需投射字典即可阅读字典。

dynamic entity = new ExpandoObject(); 
entity.MyID = 1; 

if(entity.GetType() == typeof(ExpandoObject)) 
{ 
    Console.WriteLine("I'm dynamic, use the dictionary"); 
    var dictionary = (IDictionary<string, object>)entity; 
} 
else 
{ 
    Console.WriteLine("Not dynamic, use reflection"); 
} 

您可以修改您的Mapping方法来检查是否在传递给它的目标是通过不同的路径动态路由刚过字典的键进行迭代。

https://dotnetfiddle.net/VQQZdy

+0

我试图避免字典强制转换,因为我将不得不改变代码中的每一个地方,它假定'PropertyInfo',现在几乎到处都是...... – Danicco