Как получить доступ к полю из CIL

Рейтинг: 0Ответов: 1Опубликовано: 24.02.2023

Есть класс:

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Принят

this неявно передается в качестве первого аргумента.

Таким образом у нового метода, на самом деле, 2 параметра

new Type[] { ownerType, typeof(int) },

а также, при вызове нужно тоже передавать оба

method.Invoke(null, new object[] { this, i });