获取动态对象中方法的泛型类型调用

wil*_*lvv 15 c# generics dynamic dynamicobject

我开始使用.Net中的动态对象,我无法弄清楚如何做某事.

我有一个继承自DynamicObject的类,我重写了TryInvokeMember方法.

例如

class MyCustomDynamicClass : DynamicObject
{
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        // I want to know here the type of the generic argument
    }
}
Run Code Online (Sandbox Code Playgroud)

在该方法中,我想知道调用中泛型参数的类型(如果有的话).

例如,如果我调用以下代码,我想在动态对象的覆盖方法中获取System.Boolean和System.Int32的值

dynamic myObject = new MyCustomDynamicClass();
myObject.SomeMethod<bool>("arg");
myObject.SomeOtherMethod<int>("arg");
Run Code Online (Sandbox Code Playgroud)

目前,如果我在覆盖方法中放置一个断点,我可以得到被调用方法的名称("SomeMethod"和"SomeOtherMethod",以及参数的值,但不是泛型类型).

我怎样才能获得这些价值?

谢谢!

wil*_*lvv 11

实际上,我查看了binder的层次结构,并在对象的内部字段中找到了具有所需值的属性.

问题是该属性未公开,因为它使用C#特定的代码/类,因此必须使用Reflection访问属性.

我在这个日本博客中找到了代码:http://neue.cc/category/programming(我不读任何日语,因此我不确定作者是否真的描述了同样的问题

这是片段:

var csharpBinder = binder.GetType().GetInterface("Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder");
var typeArgs = (csharpBinder.GetProperty("TypeArguments").GetValue(binder, null) as IList<Type>);
Run Code Online (Sandbox Code Playgroud)

typeArgs是一个列表,包含调用方法时使用的泛型参数的类型.

希望这有助于其他人.