首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# RealProxy:泛型方法?

C# RealProxy:泛型方法?
EN

Stack Overflow用户
提问于 2010-10-31 15:11:52
回答 2查看 2.4K关注 0票数 5

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

代码语言:javascript
复制
    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);
        ...

假设我代理一个接口,如下所示

代码语言:javascript
复制
interface IFactory
{
   TService Create<TService>()
}

当我调用代理时

代码语言:javascript
复制
proxied.Create<MyClass>()

我希望能够找出泛型参数的类型为MyClass。这可以通过RealProxy实现吗

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-31 17:27:08

有一篇关于RealProxy的很棒的MSDN article,我推荐你去读一读。除了其他功能之外,它还引入了MethodCallMessageWrapper,从而省去了直接使用Properties字典的麻烦。从后者中,您可以获得MethodBase,它又包含通用参数:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-10-31 18:49:12

对于方法调用,IMessage参数应为具有MethodBase属性的IMethodMessage

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4062181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档