xxxType.InvokeMember Method
这个是一个类型去反射某个方法,但是这个的好多个重载方法,长的一匹
不去好好理解,尼玛,太难受了。这不是很正常的吗?
重载1:
InvokeMember(String,BindingFlags,Binder,Object,Object[],ParameterModifier[],CultureInfo,String[])
重载2:
InvokeMember(String, BindingFlags, Binder, Object, Object[])
重载3:
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
所以这么看起来就一个需要分析,为啥?因为其他就是这个的阉割版
public abstract object InvokeMember
(
string name,
System.Reflection.BindingFlags invokeAttr,
System.Reflection.Binder binder,
object target,
object[] args, S
ystem.Reflection.ParameterModifier[] modifiers,
System.Globalization.CultureInfo culture,
string[] namedParameters
);
参数分析
name 故名思意就是包含要调用的构造函数、方法、属性或者字段的名称
构造函数 public A(){}
方法public void A(){}
属性public string A{get;set;}
字段public string A="";
或者用空字符串(""),表示调用默认成员
或 对于IDispatch 成员,则为一个标识DIspID 的字符串,例如"[DispID=1]"
invokerAttr BindingFlags
一个位屏蔽,由一个或者多个指定搜索执行方式的 BindingFlags组成。访问可以是 BindingFlags 之一,如public、nonpublic、private、InvokeMethod 和 GetField等 如果省略查找类型,则使用 BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static .
Binder
一个对象,该对象定义一组属性并启动绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员
或者- 要使用DefaultBinder的空引用(在vb为nothing)。为了成功地使用变量参数来调用方法重载,可能必须显示定义Binder对象。
target Object
对其调用指定成员的对象
args Object[]
包含传递给要调用的成员的参数的数组
modifiers ParameterModifier[]
ParameterModifier对象的数组,表示与args数组中的相关元素相关的特性。参数的相关的属性存储在成员的签名中
只有调用com组件时,默认联编程序才处理此参数
culture CultureInfo
表示要使用的全局化区域设置的 CultureInfo对象,他对区域设置特定的转换可能是必须的,比如将数字string转换为double。
或-要使用当前线程nothing的空引用
namedParameters String[]
包含参数名称的数组,args 数组的值传递给这些参数。
public object InvokeMember
(
string name,
System.Reflection.BindingFlags invokeAttr,
System.Reflection.Binder binder,
object target,
object[] args
);
来举个例子吧
Type.InvokeMember(
methodName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, xxx, newObject);
主要是对target不太熟悉,target就是对其调用指定成员的对象。
怎么说呢?就是说这个方法是一个类下的方法,但这个类不是静态类,这个方法也不是静态方法,那么就需要通过实例进行调用,那么target就是这个实例。建立这个实例instance的时候,用那个调用默认成员,也就是methodName为空的时候“”,就可以了。