獲取方法的相關(guān)信息的兩種形式
反射是一種允許用戶獲得類信息的C#功能,Type對象映射它代表的底層對象;
在.Net 中, 一旦獲得了Type對象,就可以使用GetMethods()方法獲取此類型支持的方法列表;該方法的兩種形式:
MethodInfo [] GetMethods()
MethodInfo [] GetMethods(BindingFlags bindingflas) :它的參數(shù)帶有一些限制 BindingFlags 是一個枚舉
枚舉成員 [DeclaredOnly,Instance ,Public] 枚舉成員的功能使用 在編譯器中使用"."符號后自己認(rèn)真觀察 【相信你很快能夠理解】
ParameterInfo[] GetParameters() 方法返回一個方法的參數(shù)列表
下面用到的類 MyClass ,為了方便閱讀,我把它折疊了!
MyClass
Main:
使用反射調(diào)用方法
上面 討論了怎么獲取一個類型所支持的方法,然而為我們獲取對方法的調(diào)用做了充分的準(zhǔn)備!
MethodInfo類中的Invoke() 方法提供了該技能!
它的一種形式: object Invoke(object obj,object [] paramenters)
obj 是一個對象引用,將調(diào)用它所指向的對象上的方法,對于static方法,obj必須為null。
所有需要傳遞給方法的參數(shù)都必須在parameters數(shù)組中指定。如果方法不需要參數(shù),則paramenters必須為null
基類MethodBase的 Invoke()方法返回被調(diào)用方法的返回值
請看下面的事例:
MyClass類Set()方法有所改變:
foreach (MethodInfo m in mi)//調(diào)用每個方法
{
//獲得方法參數(shù)
ParameterInfo[] pi = m.GetParameters();
if (m.Name.Equals("Set",StringComparison.Ordinal)&&pi[0].ParameterType==typeof(int))
{
// 指定 System.String.Compare(System.String,System.String) 和 System.String.Equals(System.Object)
// 方法的某些重載要使用的區(qū)域、大小寫和排序規(guī)則。
//StringComparison.Ordinal 使用序號排序規(guī)則比較字符串
object[] obj = new object[2];
obj[0] = 9;
obj[1] = 18;
m.Invoke(reflectOb, obj);
}
else if (m.Name.Equals("Set",StringComparison.Ordinal)&&pi[0].ParameterType==typeof(double))
{
object[] obj = new object[2];
obj[0] = 1.12;
obj[1] = 23.4;
m.Invoke(reflectOb, obj);
}
else if (m.Name.Equals("Sum",StringComparison.Ordinal))
{
val = (int)m.Invoke(reflectOb, null);
Console.WriteLine("Sum is : " + val);
}
else if (m.Name.Equals("IsBetween", StringComparison.Ordinal))
{
object[] obj = new object[1];
obj[0] = 14;
if ((bool)m.Invoke(reflectOb, obj))
{
Console.WriteLine("14 is between x and y");
}
}
else if (m.Name.Equals("Show",StringComparison.Ordinal))
{
m.Invoke(reflectOb,null);
}
}
Main
|
新聞熱點
疑難解答
圖片精選