如何制作通用的MethodInvoke?

rus*_*der 0 c# generics reflection

上下文我想通过反射来调用此函数

instanceOfEventPublisher.Publish<T>(T eventInst);

我打电话的时候

`private void GenCall(IEventPublisher eventPublisher,object theEventObj){

        var thePublisher = eventPublisher.GetType();
        thePublisher.InvokeMember(
            "Publish",
            BindingFlags.Default | BindingFlags.InvokeMethod,
            null,
            eventPublisher,
            new object[] {theEventObj}
            );
    }
Run Code Online (Sandbox Code Playgroud)

`

我得到:System.MissingMethodException:找不到方法'EventAggregator.EventPublisher.Publish'.

如何调用通用?

Jos*_*rke 5

您需要使用MakeGenericType方法,如下所示:

var realizedType = thePublisher.MakeGenericType(eventObj.GetType());
Run Code Online (Sandbox Code Playgroud)

然后,您可以在realizeType上调用Publish方法.如果您处理Generic类型,情况就是如此; 但是,您的代码看起来并不像.您为eventPublisher加入的接口不是通用接口.

你可以发布你的其余代码,所以我们可以看到接口定义和泛型类定义.

编辑

这里有一些示例代码,我展示了如何通过反射调用泛型类型的方法:

  public class Publisher<T>
    {
        public void Publish(T args)
        {
            Console.WriteLine("Hello");
        }
    }
    static void Main(string[] args)
    {

        var type = typeof(Publisher<>);

        Publisher<EventArgs> publisher = new Publisher<EventArgs>();

        var realizedType = type.MakeGenericType(typeof(EventArgs));
        realizedType.InvokeMember("Publish", BindingFlags.Default | BindingFlags.InvokeMethod,
        null,
        publisher
        ,
        new object[] { new EventArgs() });

    }
Run Code Online (Sandbox Code Playgroud)