Frage C # RealProxy: generische Methoden?


Ich versuche, einen Aufruf einer generischen Methode durch eine zu behandeln RealProxy, aber ich kann nicht die Informationen über den tatsächlichen Typ des generischen Parameters finden, der im abgefangenen Methodenaufruf verwendet wurde. Ein Auszug aus dem Code:

    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);
        ...

Nehmen wir an, ich vertrete eine Schnittstelle wie

interface IFactory
{
   TService Create<TService>()
}

Wenn ich den Proxy anrufe

proxied.Create<MyClass>()

Ich möchte herausfinden können, dass der generische Parameter vom Typ ist MyClass. Ist das möglich durch? RealProxy?


5
2017-10-31 07:11


Ursprung


Antworten:


Es gibt ein ausgezeichnetes MSDN-Artikel über RealProxy, die ich Ihnen empfehlen zu lesen. Unter anderem wird es vorgestellt MethodCallMessageWrapper Das erspart Ihnen die Mühe, direkt gegen die Properties Wörterbuch. Von letzterem können Sie die MethodBase, die wiederum die generischen Argumente enthält:

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(...);
  }

  ...
}

6
2017-10-31 09:27



Für Methodenaufrufe kann der IMessage Argument sollte sein a IMethodMessage, die a hat MethodBase Eigentum:

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
    }
}

3
2017-10-31 10:49