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是一个列表,包含调用方法时使用的泛型参数的类型.
希望这有助于其他人.