我有一个库,它依赖于它接收的类的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()
?
答案 0 :(得分: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
方法以检查传入的对象是否是动态的,并通过不同的路径路由,该路径只是迭代字典的键。