设置类的私有属性

时间:2011-03-04 13:49:53

标签: performance reflection c#-4.0 codedom linq-expressions

我有一些非常古老的代码,它使用反射来设置对象的属性,例如:

var properties = obj.GetType().GetProperties(
  BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var property in properties)
{
  property.SetValue(obj, lookup[property.Name]);
}

我正在考虑更换代码以使其更快。但是因为上面的代码也允许设置对象的私有属性,我不确定还有其他选项。

问题:

  1. 我是否正确,编译后的表达式(使用System.Linq.Expressions)和生成的代码(使用CodeDom / Microsoft.CSharp.CSharpCodeProvider)不能用于设置私有属性?
  2. 使用Reflection.Emit可以实现吗?
  3. 任何映射库(AutoMapperValueInjecter)都可以为此提供帮助(我不知道他们在内部使用了什么技术)?
  4. 还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

开源框架Impromptu-Interface有一个静态方法InvokeSet使用DLR而不是反射,它将调用私有方法。它的运行速度比单位速度测试案例中的反射快2倍,看起来与你的相似。

using ImpromptuInterface;

...

foreach(var property in properties){
    ImpromptuInterface.InvokeSet(obj, property.Name, lookup[property.Name]);
}