5 Stimmen

C# RealProxy: generische Methoden?

Ich versuche, den Aufruf einer generischen Methode durch eine RealProxy Ich kann jedoch keine Informationen über den tatsächlichen Typ des im abgefangenen Methodenaufruf verwendeten generischen Parameters finden. 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 vermittle eine Schnittstelle wie

interface IFactory
{
   TService Create<TService>()
}

Wenn ich den Proxy aufrufe

proxied.Create<MyClass>()

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

6voto

Ohad Schneider Punkte 34748

Es gibt eine ausgezeichnete MSDN-Artikel über RealProxy, die ich Ihnen empfehle zu lesen. Darin wird unter anderem Folgendes vorgestellt MethodCallMessageWrapper was Ihnen die Mühe erspart, direkt mit der Properties Wörterbuch. Aus letzterem können Sie die MethodBase , die wiederum die allgemeinen 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(...);
  }

  ...
}

3voto

Ruben Punkte 14679

Bei Methodenaufrufen wird die IMessage Argument sollte ein IMethodMessage die einen 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
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X