Как получить доступ к полю из CIL
Есть класс:
public class Test
{
private string[] _array;
public Test(int n)
{
_array = new string[n];
}
//return _array[i];
public string Method(int i)
{
var ownerType = this.GetType();
DynamicMethod method = new DynamicMethod("test_method",
typeof(string),
new Type[] { typeof(int) },
ownerType );
var generator = method.GetILGenerator();
var arrayField = ownerType.GetField("_array", BindingFlags.NonPublic | BindingFlags.Instance);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, arrayField);
generator.Emit(OpCodes.Ldarg_1);
generator.Emit(OpCodes.Ldelem_Ref);
generator.Emit(OpCodes.Ret);
return (string)method.Invoke(null, new object[] { i });
}
}
При вызове Method
исключение
System.Reflection.TargetInvocationException: 'Exception has been thrown by the target of an invocation. Inner Exception: NullReferenceException: Object reference not set to an instance of an object.'
. Как мне подгрузить текущий инстанс класса так, чтобы его члены были доступны в DynamicMethod'е?
Источник: Stack Overflow на русском