c#反射調(diào)用方法示例
獲取方法的相關(guān)信息的兩種形式
反射是一種允許用戶獲得類信息的C#功能,Type對象映射它代表的底層對象;
在.Net 中, 一旦獲得了Type對象,就可以使用GetMethods()方法獲取此類型支持的方法列表;該方法的兩種形式:
MethodInfo [] GetMethods()
MethodInfo [] GetMethods(BindingFlags bindingflas) :它的參數(shù)帶有一些限制 BindingFlags 是一個枚舉
枚舉成員 [DeclaredOnly,Instance ,Public] 枚舉成員的功能使用 在編譯器中使用"."符號后自己認(rèn)真觀察 【相信你很快能夠理解】
ParameterInfo[] GetParameters() 方法返回一個方法的參數(shù)列表
下面用到的類 MyClass ,為了方便閱讀,我把它折疊了!
class MyClass
{
int x;
int y;
public MyClass(int i, int j)
{
this.x = i;
this.y = j;
}
public int Sum()
{
return x + y;
}
public bool IsBetween(int i)
{
if (x < i && i < y)
{
return true;
}
return false;
}
public void Set(int a, int b)
{
x = a;
y = b;
}
public void Set(double a, double b)
{
x = (int)a;
y = (int)b;
}
public void Show()
{
Console.WriteLine("x: " + x + " y: " + y);
}
}
MyClass
Main:
Type t = typeof(MyClass);//獲得一個表示MyClass類的Type對象
Console.WriteLine("獲取當(dāng)前成員的名稱" + t.Name);
Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
Console.WriteLine("支持的方法");
#region 第一種形式
//MethodInfo[] mi = t.GetMethods();//顯示Class類中被支持的方法
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//方法GetMethods() 把 MyClass 的基類 object方法都顯示出來了
//下面我們說說 GetMethods() 的另外一種形式,有限制的顯示
#endregion
#region 第二種形式
MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
#endregion
foreach (MethodInfo m in mi)
{
//返回后打印出MyClass類中成員的類型(方法的返回值類型)極其方法名稱
Console.Write(" " + m.ReturnType.Name + " " + m.Name + " (");//ReturnType獲取此方法的返回類型
ParameterInfo[] pi = m.GetParameters();//獲得方法的參數(shù)
for (int i = 0; i < pi.Length; i++)
{
Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name);//ParameterType 獲取該參數(shù)的Type(類型)
if (i+1<pi.Length)
{
Console.Write(", ");
}
}
Console.WriteLine(")");
Console.WriteLine();
}
Console.ReadKey();
使用反射調(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()方法有所改變:
public void Set(int a, int b)
{
Console.WriteLine("Set(int,int)");
x = a;
y = b;
Show();
}
public void Set(double a, double b)
{
Console.WriteLine("Set(double,double)");
x = (int)a;
y = (int)b;
Show();
}
Type t = typeof(MyClass);
MyClass reflectOb = new MyClass(10, 20);
int val;
Console.WriteLine("Invoke methods in " + t.Name);//調(diào)用MyClass類的方法
Console.WriteLine();
MethodInfo[] mi = t.GetMethods();
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
相關(guān)文章
C#簡單嵌套flash讀取數(shù)據(jù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了C#簡單嵌套flash讀取數(shù)據(jù)的實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2013-11-11C#裝飾器模式(Decorator Pattern)實(shí)例教程
這篇文章主要介紹了C#裝飾器模式(Decorator Pattern),以一個完整實(shí)例形式講述了C#裝飾器模式的實(shí)現(xiàn)過程,有助于深入理解C#程序設(shè)計(jì)思想,需要的朋友可以參考下2014-09-09C#在winform中實(shí)現(xiàn)數(shù)據(jù)增刪改查等功能
本篇文章主要是介紹了C#在winform中操作數(shù)據(jù)庫,實(shí)現(xiàn)數(shù)據(jù)增刪改查,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11