Как получить доступ к полю из 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'е?
Ответы (1 шт):
Автор решения: Grundy
→ Ссылка
this неявно передается в качестве первого аргумента.
Таким образом у нового метода, на самом деле, 2 параметра
new Type[] { ownerType, typeof(int) },
а также, при вызове нужно тоже передавать оба
method.Invoke(null, new object[] { this, i });