2012-07-21 152 views
4

我正在使用Reflection.Emit來爲飛行中的字段生成getters。到目前爲止,我的代碼適用於我測試過的所有情況,除非該字段未公開。當該字段未公開時,調用委託會拋出「System.NullReferenceException:未將對象引用設置爲對象的實例。」Reflection.Emit私人領域/財產訪問

我使用這個代碼來生成:(字段是字段信息)

DynamicMethod dm = new DynamicMethod(String.Concat ("_Set", field.Name, "_"), typeof(void), 
              new Type[] { typeof(object), typeof(object) }, 
              field.DeclaringType, true); 
ILGenerator generator = dm.GetILGenerator(); 

generator.Emit (OpCodes.Ldarg_0); 
generator.Emit (OpCodes.Ldarg_1); 
if (field.FieldType.IsValueType) 
    generator.Emit (OpCodes.Unbox_Any, field.FieldType); 
generator.Emit (OpCodes.Stfld, field); 
generator.Emit (OpCodes.Ret); 

return (Action<object, object>)dm.CreateDelegate (typeof(Action<object, object>)); 

回答

1

你用正確的參數調用?對於私人領域,你需要指定BindingFlags.NonPublic這樣的:

var field = this.GetType().GetField("someField", BindingFlags.NonPublic | BindingFlags.Instance); 

var field = this.GetType().GetField("someField", BindingFlags.NonPublic | BindingFlags.Static); 

你能後的程序引發異常的完整的例子?

+0

啊,這解決了我的問題。然而,它並沒有解決類似的問題,我認爲它與性質有關。我會爲此發佈一個新問題。謝謝。 – Nol 2012-07-21 07:10:04