C# RealProxy: универсальные методы?
Я пытаюсь обработать вызов универсального метода через 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
?
2 ответа
Есть отличная статья о 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(...);
}
...
}
Для вызовов методов IMessage
аргумент должен быть IMethodMessage
, который имеет MethodBase
имущество:
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
}
}