2011-03-04 49 views
3

私有属性我有使用反射来设置对象的属性,e.g像这样一些很老的代码:设置类

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. 是否有任何映射库(AutoMapper,ValueInjecter)对此有帮助(我不知道他们在内部使用什么技术)?
  4. 还有其他的选择吗?

回答

1

开源框架Impromptu-Interface有一个静态方法InvokeSet使用DLR而不是反射,它会调用私有方法。在单位速度测试案例中,它的反应速度比反射速度快2倍,这与您的测试案例相似。

using ImpromptuInterface; 

...

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

谢谢,我会看看它。 – M4N 2011-03-08 13:46:08