Как создать динамический метод в С#, который использует параметр «in»?

Я пытаюсь создать в .NET динамический метод с параметром "in", но он выдает исключение в EmitCallлиния:

      public struct Context
{
    public string MyString { get; set; }
}

public interface IHandler<T>
{
    void MyMethod(in Context context);
}

class MyMessage
{
}

class MyClass : IHandler<MyMessage>
{
    public void MyMethod(in Context context)
    {
    }
}

class ContextMethodInvoker
{
    private readonly InvokeHandler _invoker;

    private delegate void InvokeHandler(object handler, in Context context);

    public ContextMethodInvoker(MethodInfo methodInfo)
    {
        var dynamicMethod = new DynamicMethod(string.Empty,
            typeof(void), new[] { typeof(object), typeof(Context).MakeByRefType() });
        dynamicMethod.DefineParameter(1, ParameterAttributes.None, "handler");
        dynamicMethod.DefineParameter(2, ParameterAttributes.In, "context");

        var il = dynamicMethod.GetILGenerator();
        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldarg_1);

        il.EmitCall(OpCodes.Callvirt, methodInfo, null);
        il.Emit(OpCodes.Ret);

        _invoker = (InvokeHandler)dynamicMethod.CreateDelegate(typeof(InvokeHandler));
    }

    public void Invoke(object handler, in Context context)
    {
        _invoker.Invoke(handler, in context);
    }
}

А также:

      var messageHandlerType = typeof(IHandler<>);
var messageType = typeof(MyMessage);
var type = typeof(MyClass);

var interfaceType = messageHandlerType.MakeGenericType(messageType);

 
var contextMethod = new ContextMethodInvoker(
    type.GetInterfaceMap(interfaceType).TargetMethods.SingleOrDefault()
);

var tm = new Context
{
    MyString = "test"
};
contextMethod.Invoke(Activator.CreateInstance(type), tm);

Что я делаю не так? Когда я удаляю ключевые слова "in" и MakeByRefType, это работает.

0 ответов

Другие вопросы по тегам