2011-03-04 50 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