獲取方法的相關信息的兩種形式
反射是一種允許用戶獲得類信息的C#功能,Type對象映射它代表的底層對象;
在.Net 中, 一旦獲得了Type對象,就可以使用GetMethods()方法獲取此類型支持的方法列表;該方法的兩種形式:
MethodInfo [] GetMethods()
MethodInfo [] GetMethods(BindingFlags bindingflas) :它的參數(shù)帶有一些限制 BindingFlags 是一個枚舉
枚舉成員 [DeclaredOnly,Instance ,Public] 枚舉成員的功能使用 在編譯器中使用"."符號后自己認真觀察 【相信你很快能夠理解】
ParameterInfo[] GetParameters() 方法返回一個方法的參數(shù)列表
下面用到的類 MyClass ,為了方便閱讀,我把它折疊了!
MyClass
Main:
   
使用反射調用方法
上面 討論了怎么獲取一個類型所支持的方法,然而為我們獲取對方法的調用做了充分的準備!
MethodInfo類中的Invoke() 方法提供了該技能!
它的一種形式: object Invoke(object obj,object [] paramenters)
obj 是一個對象引用,將調用它所指向的對象上的方法,對于static方法,obj必須為null。
所有需要傳遞給方法的參數(shù)都必須在parameters數(shù)組中指定。如果方法不需要參數(shù),則paramenters必須為null
基類MethodBase的 Invoke()方法返回被調用方法的返回值
請看下面的事例:
MyClass類Set()方法有所改變:
foreach (MethodInfo m in mi)//調用每個方法
{
    //獲得方法參數(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
新聞熱點
疑難解答