什么时候需要用到Type.DefaultBinder之外的binder
什么时候需要用到Type.DefaultBinder以外的binder?
通常,用动态Invoke方式调用方法的时候,有个Binder参数通常是指定null,代表使用Type.DefaultBinder以外的binder。
假设有个Type,有个方法叫做method,输入参数是一个string,输出参数也是一个string
那么什么情况,或者应用场景下面,需要使用Type.DefaultBinder以外的绑定方式呢?
我之所以问这个问题,是因为如果使用其他的方式来Invoke一个方法或者属性,例如
那么和Type.InvokeMember相比,我好像根本没有机会来指定一个绑定器?
那么这两种Invoke方式到底有什么不同的地方,为什么InvokeMember可以有一个绑定器参数。
------解决思路----------------------
Binder很少需要用到。你的情况中,叫method的方法只有一个,不会有歧义,不需要用到Binder。
如下例子的Calc方法有两个重载,InvokeMethod的时候会有歧义。
这种时候,自定义的Binder可以是解决歧义的方法之一。
------解决思路----------------------
Binder很少需要用到。如果你很想研究,可以从下例开始:
https://msdn.microsoft.com/en-us/library/system.reflection.binder(v=vs.100).aspx
通常,用动态Invoke方式调用方法的时候,有个Binder参数通常是指定null,代表使用Type.DefaultBinder以外的binder。
假设有个Type,有个方法叫做method,输入参数是一个string,输出参数也是一个string
string ret = (string)Mytype.InvokeMember(
"method",
BindingFlags.InvokeMethod,
null,//这个是null
null,
new string[1] { "abc" }
);
那么什么情况,或者应用场景下面,需要使用Type.DefaultBinder以外的绑定方式呢?
我之所以问这个问题,是因为如果使用其他的方式来Invoke一个方法或者属性,例如
MethodInfo mi = mytype.GetMethod("method");
mi.Invoke(obj, new string[1] { "abc" });
那么和Type.InvokeMember相比,我好像根本没有机会来指定一个绑定器?
那么这两种Invoke方式到底有什么不同的地方,为什么InvokeMember可以有一个绑定器参数。
------解决思路----------------------
Binder很少需要用到。你的情况中,叫method的方法只有一个,不会有歧义,不需要用到Binder。
如下例子的Calc方法有两个重载,InvokeMethod的时候会有歧义。
这种时候,自定义的Binder可以是解决歧义的方法之一。
public static void Main()
{
object ret = typeof(A).InvokeMember(
"Calc",
BindingFlags.InvokeMethod,
null,
null,
new object[] { (byte)123 });
// 猜猜ret是123,还是246?
}
class A
{
public static int Calc(int i) { return i + i; }
public static short Calc(short s) { return s; }
}
------解决思路----------------------
Binder很少需要用到。如果你很想研究,可以从下例开始:
https://msdn.microsoft.com/en-us/library/system.reflection.binder(v=vs.100).aspx