Reflection.Emitを使用して、フィールドのゲッターをオンザフライで生成しています。これまでのところ、フィールドが公開されていない場合を除いて、テストしたすべてのケースでコードが機能します。フィールドが公開されていない場合、デリゲートを呼び出すと、「System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません」がスローされます。
私はこのコードを使用して次を生成しています:(フィールドはFieldInfoです)
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>));