3

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

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. 还有其他选择吗?
4

1 回答 1

1

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

using ImpromptuInterface;

...

foreach(var property in properties){
    ImpromptuInterface.InvokeSet(obj, property.Name, lookup[property.Name]);
}
于 2011-03-08T01:24:15.953 回答