代码之家  ›  专栏  ›  技术社区  ›  Igor Brejc

C#RealProxy:泛型方法?

  •  5
  • Igor Brejc  · 技术社区  · 14 年前

    我试图通过 RealProxy ,但我似乎找不到有关截获的方法调用中使用的泛型参数的实际类型的信息。代码摘录:

        public override IMessage Invoke(IMessage msg)
        {
            ...
            string methodName = (string)msg.Properties["__MethodName"];
            Type[] parameterTypes = (Type[])msg.Properties["__MethodSignature"];
            object[] args = (object[])msg.Properties["__Args"];
    
            MethodInfo method = typeToProxy.GetMethod(methodName, parameterTypes);
            ...
    

    假设我代理一个接口

    interface IFactory
    {
       TService Create<TService>()
    }
    

    当我给代理打电话时

    proxied.Create<MyClass>()
    

    我想找出泛型参数的类型 MyClass . 这有可能通过 真实代理 ?

    2 回复  |  直到 14 年前
        1
  •  6
  •   Ohad Schneider    8 年前

    有一个很好的 MSDN article 关于RealProxy我建议你阅读。 MethodCallMessageWrapper 这就省去了你直接对付 Properties 字典。从后者你可以得到 MethodBase ,它又包含泛型参数:

    internal class MyProxy : RealProxy
    {
       private object m_instance;    
       private MyProxy( object instance ) : base( typeof( IFactory) )
       {
          m_instance = instance;
       }
    
      public override IMessage Invoke( IMessage message )
      {
         IMethodCallMessage methodMessage =
            new MethodCallMessageWrapper( (IMethodCallMessage) message );
    
         // Obtain the actual method definition that is being called.
         MethodBase method = methodMessage.MethodBase;
    
         Type[] genericArgs = method.GetGenericArguments(); //This is what you want
    
         return new ReturnMessage(...);
      }
    
      ...
    }
    
        2
  •  3
  •   Ruben    14 年前

    IMessage 参数应该是 IMethodMessage MethodBase 属性:

    public override IMessage Invoke(IMessage message)
    {
        IMethodMessage methodMessage = message as IMethodMessage;
        if (methodMessage != null)
        {
             MethodBase method = methodMessage.MethodBase;
             Type[] genericArgs = method.GetGenericArguments();
    
             ...
        }
        else
        {
            // not a method call
        }
    }
    
    推荐文章