C#RealProxy:泛型方法?

Igo*_*ejc 5 c# generics reflection realproxy

我试图通过a来处理泛型方法的调用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);
        ...
Run Code Online (Sandbox Code Playgroud)

假设我代理了一个类似的界面

interface IFactory
{
   TService Create<TService>()
}
Run Code Online (Sandbox Code Playgroud)

当我打电话给代理

proxied.Create<MyClass>()
Run Code Online (Sandbox Code Playgroud)

我希望能够找出泛型参数的类型MyClass.这可能通过RealProxy吗?

Oha*_*der 6

一篇关于RealProxy 的优秀MSDN文章,我建议你阅读.除此之外,它还介绍了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(...);
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)