Как создать динамический метод в С#, который использует параметр «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, это работает.