我试图通过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。这可以通过RealProxy实现吗
发布于 2010-10-31 17:27:08
有一篇关于RealProxy的很棒的MSDN article,我推荐你去读一读。除了其他功能之外,它还引入了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(...);
}
...
}发布于 2010-10-31 18:49:12
对于方法调用,IMessage参数应为具有MethodBase属性的IMethodMessage:
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
}
}https://stackoverflow.com/questions/4062181
复制相似问题