代码之家  ›  专栏  ›  技术社区  ›  ruslander

如何创建一个通用的MethodInvoke?

  •  0
  • ruslander  · 技术社区  · 15 年前

    上下文 我想通过反射打这个电话

    instanceOfEventPublisher.Publish<T>(T eventInst);

    当我呼唤

    ` private void gencall(IEventPublisher事件发布服务器,Object theEventObj){

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

    `

    我得到: System.MissingMethodException:找不到方法“EventAggregator.EventPublisher.Publish”。

    如何调用泛型?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Tinister    15 年前

    你可能得这么做 GetMethods() 搜索“发布” MethodInfo . 或者,如果“发布”没有过载,那么您可能只需要 GetMethod("Publish") .无论哪种情况,你都需要打电话 MakeGenericMethod() 方法信息 添加类型参数。

    MethodInfo constructedPublish = thePublisher.GetMethod("Publish")
        .MakeGenericMethod( theEventObject.GetType() );
    constructedPublish.Invoke( eventPublisher, new object[] { theEventObject } );
    
        2
  •  5
  •   JoshBerke    15 年前

    您需要使用makeGenericType方法,如:

    var realizedType = thePublisher.MakeGenericType(eventObj.GetType());
    

    然后,您可以调用publish方法,就像在realizedType上使用它一样。如果您处理的是一个泛型类型,这是正确的;但是,您的代码看起来不像是这样。您为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() });
    
        }
    
        3
  •  0
  •   Noon Silk    15 年前

    也许您使用了反勾记法:

    Publish`1[[assemblyQualifiedNameOfTypeOfClassl]]
    

    (只是猜测;没有测试)。