gpt4 book ai didi

C# 真实代理 : generic methods?

转载 作者:太空狗 更新时间:2023-10-29 22:34:43 26 4
gpt4 key购买 nike

我试图通过 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),例如

interface IFactory
{
TService Create<TService>()
}

当我调用代理时

proxied.Create<MyClass>()

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

最佳答案

有一个优秀的MSDN article关于 RealProxy,我建议您阅读。除其他外,它还引入了 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(...);
}

...
}

关于C# 真实代理 : generic methods?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4062181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com