本節(jié)先介紹system.Type類,通過這個類可以訪問關(guān)于任何數(shù)據(jù)類型的信息。
1. system.Type類以前把Type看作一個類,但它實際上是一個抽象的基類。只要實例化了一個Type對象,實際上就實例化了Typc的一個派生類。盡管一般情況下派生類只提供各種Type方法和屬性的不同重載,但是這些方法和屬性返回對應(yīng)數(shù)據(jù)類型的正確數(shù)據(jù),Type有與每種數(shù)據(jù)類型對應(yīng)的派生類。 通常,獲取指向任何給定類型的Type引用有3種常用方式:(1) 使用C#的typeof運算符
Typef = typeof(double)
(2) 使用GetType()方法,所有的類都會從system.object繼承這個方法。
double d = 10;Type t = d.GetType();
(3) 還可以調(diào)用Type類的靜態(tài)方法GetTypeO:
Type t = Type。GetType("system.Double");Type是許多反射功能的入口 。注意,可用的屬性都是只讀的:可以使用Type確定數(shù)據(jù)的類型,但不能使用它修改該類型!2. Type屬性



3. 方法
system.Type的大多數(shù)方法都用于獲取對應(yīng)數(shù)據(jù)類型的成員信息:構(gòu)造函數(shù)、屬性、方法和事件等。它有許多方法,但它們都有相同的模式。例如,有兩個方法可以獲取數(shù)據(jù)類型的方法的細節(jié)信息:GetMethodO和GetMethods. GetMethods方法返回System.Reflection.MethodInfo對象的一個引用,其中包含一個方法的細節(jié)信息。GetMethods()返回這種引用的一個數(shù)組。其區(qū)別是GetMethods()方法返回所有方法的細節(jié)信息;而GetMethod()方法返回一個方法的細節(jié)信息,其中該方法包含特定的參數(shù)列表。這兩個方法都有重載方法,重載方法有一個附加的參數(shù),即BindingFlags枚舉值,該值表示應(yīng)返回哪些成員,例如,返回公有成員、實例成員和靜態(tài)成員等。
舉例:

方法:

GetMember()和GetMembers()方法返回數(shù)據(jù)類型的任何成員或所有成員的詳細信息,不管這些成員是構(gòu)造函數(shù)、屬性和方法等。
4. C#反射結(jié)合System.Type類實例
namespace myNameSpace { class PRogram { static void Main(string[] args) { /* TypeView示例 star */ Type t = typeof(myClass); AnalyzeType(t); /* TypeView示例 end */ Console.ReadLine(); } //定義嵌套類myClass class myClass { private string _my; public string My { get { return _my; } set { _my = value; } } } //通過System.Type類提供的方法分析類中的成員信息 static void AnalyzeType(Type t) { //當前成員名 Console.WriteLine(t.Name); //myClass //完全限定名,包含命名空間 Console.WriteLine(t.FullName); //myNameSpace.myClass //命名空間 Console.WriteLine(t.Namespace); //myNameSpace //獲取直接繼承的類 Type tBase = t.BaseType; if (tBase != null) { Console.WriteLine(tBase.Name); //Object } //該類公共語言運行庫提供的類型 Type tUnderlyingSystem = t.UnderlyingSystemType; if (tUnderlyingSystem != null) { Console.WriteLine(tUnderlyingSystem.Name); //myClass } //返回當前類型的所有公共成員數(shù)組 MemberInfo[] Members = t.GetMembers(); //遍歷數(shù)組,迭代每個成員信息 foreach (MemberInfo NextMember in Members) { Console.WriteLine(NextMember.DeclaringType + "," + NextMember.MemberType + "," + NextMember.Name); } } } }實例轉(zhuǎn)載http://blog.csdn.net/lulu_jiang/article/details/5683879
遍歷獲取一個類的所有屬性名
private void button1_Click(object sender, EventArgs e) 2 { 3 Type t = typeof(System.Drawing.Color); 4 string className = t.Name; 5 MessageBox.Show(className); 6 7 //獲取所有方法 8 System.Reflection.MethodInfo[] methods = t.GetMethods(); 9 this.textBox1.Text = "";10 foreach (System.Reflection.MethodInfo method in methods)11 {12 this.textBox1.Text += method.Name + System.Environment.NewLine;13 }1415 //獲取所有成員16 System.Reflection.MemberInfo[] members = t.GetMembers();1718 //獲取所有屬性19 System.Reflection.PropertyInfo[] properties = t.GetProperties();20 foreach (System.Reflection.PropertyInfo property in properties)21 {22 this.lstColors.Items.Add(property.Name);23 }24 }2526 private void lstColors_SelectedIndexChanged(object sender, EventArgs e)27 {28 this.pictureBox1.BackColor= System.Drawing.Color.FromName(((ListBox)sender).Text);29 }方法,構(gòu)造函數(shù)等一些類型信息的獲取可以參考http://m.survivalescaperooms.com/knowledgesea/archive/2013/03/02/2935920.html這個博客對.net反射講解很清楚,實例也比較容易理解。
新聞熱點
疑難解答