2. Type類的介紹
成員 | 成員類型 | 描述 |
Name | 屬性 | 返回類型的名字 |
FullName | 屬性 | 返回?cái)?shù)據(jù)類型的完全限定名(包括命名空間名) |
NameSpace | 屬性 | 返回包含數(shù)據(jù)類型聲明的命名空間 |
Assembly | 屬性 | 返回聲明類型的程序集。如果類型是泛型的,返回定義這個(gè)類型的程序集 |
GetConstructor(), GetConstructors() | 方法 | 返回ConstructorInfo類型,用于取得該類的構(gòu)造函數(shù)的信息 |
GetEvent(), GetEvents() | 方法 | 返回EventInfo類型,用于取得該類的事件的信息 |
GetField(), GetFields() | 方法 | 返回FieldInfo類型,用于取得該類的字段(成員變量)的信息 |
GetInterface(), GetInterfaces() | 方法 | 返回InterfaceInfo類型,用于取得該類實(shí)現(xiàn)的接口的信息 |
GetMember(), GetMembers() | 方法 | 返回MemberInfo類型,用于取得該類的所有成員的信息 |
GetMethod(), GetMethods() | 方法 | 返回MethodInfo類型,用于取得該類的方法的信息 |
GetProperty(), GetProperties() | 方法 | 返回PropertyInfo類型,用于取得該類的屬性的信息 |
3. 如何獲取Type類型
3.1GetType()和typeof() 方法 兩者都是返回Syetem.Type的引用。(private和protected修飾的成員也可以訪問到)
3.1.1 GetType()
1.GetType()是從Syetem.object中基礎(chǔ)的方法。
2.GetType()必須要通過類型的實(shí)例點(diǎn)出這個(gè)方法。
3.1.2 typeof()
1.typeof(xx)是公開的運(yùn)算符。
2.typeof(xx)中xx只能是int,string 等類型及自定義類型,不能是實(shí)例。
3.2 不同點(diǎn)
1.GetType()返回的是Type(類型)
2.typeof(xx) 返回的是xx Class(類)的類型
1 //實(shí)例一個(gè)用戶類 2 User user = new User(); 3 //GetType()方法 4 Type getType = user.GetType(); 5 //typeof(xx) 方法 6 Type typeOf = typeof(User); 7 //判斷是否相等 8 if (getType == typeOf) 9 {10 //這里相等11 Console.WriteLine("我在這");12 }
4.Type類方法
1: 一旦有了Type對(duì)象就可以使用GetMethodInfo()方法獲取此類型支持的方法列表。該方法返回一個(gè)MethodInfo 對(duì)象數(shù)組,MethodInfo對(duì)象描述了主調(diào)類型所支持的方法,他位于System.Reflection命名空間中
2: MethodInfo類派生于MethodBase抽象類,而MethodBase類繼承了MemberInfo類。因此我們能夠使用這三個(gè)類定義的屬性和方法。例如,使用Name屬性得到方法名稱。這里有兩個(gè)重要的成員:
3: ReturnType屬性 :為Type類型的對(duì)象,能夠提供方法的返回類型信息 GetParameters()方法 :返回參數(shù)列表,參數(shù)信息以數(shù)組形式保存在PatameterInfo對(duì)象中。PatameterInfo類定義了大量描述參數(shù)信息的屬性和方法。這里也列出兩個(gè)常用的屬性 :Name(包含參數(shù)名稱信息的字符串),ParameterType(參數(shù)類型的信息)。
//創(chuàng)建實(shí)例 Sublevel sublevel = new Sublevel(); //獲取類型 Type sublevelType = sublevel.GetType(); //獲取類型的方法列表 //BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public 這個(gè)有一個(gè)注意點(diǎn) //實(shí)際上至少要有Instance(或Static)與Public(或NonPublic)標(biāo)記。否則將不會(huì)獲取任何方法。 MethodInfo[] obj = sublevelType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); //遍歷所有的方法 foreach (MethodInfo item in obj) { //返回方法的返回類型 Console.Write(item.ReturnType.Name); //返回方法的名稱 Console.Write(" "+item.Name+"("); //獲取方法的返回參數(shù)列表 ParameterInfo[] parameterss = item.GetParameters(); foreach (var parameters in parameterss) { //參數(shù)類型名稱 Console.Write(parameters.ParameterType.Name); //參數(shù)名稱 Console.Write(" "+parameters.Name+","); } Console.WriteLine(")"); }
執(zhí)行的結(jié)果,獲取了所有的方法,包括了方法的方法名稱,方法的返回類型,方法參數(shù)列表。
5.方法的使用
前面我們講了放的顯示,但是只能看到不能用就不好了呀!?。?/p>
5.1:GetMethods()方法的另一種形式
這種形式可以制定各種標(biāo)記,已篩選想要獲取的方法。他的通用形式為:MethodInfo[] GetMethods(BindingFlags bindingAttr)BindingFlags是一個(gè)枚舉,枚舉值有(很多只列出4個(gè)吧)
GetMethods(BindingFlags bindingAttr)這個(gè)方法,參數(shù)可以使用or把兩個(gè)或更多標(biāo)記連接在一起,實(shí)際上至少要有Instance(或Static)與Public(或NonPublic)標(biāo)記。否則將不會(huì)獲取任何方法。del.GetType();
public static void Method<T>(T model) { //獲取泛性的Type類型 Type objType = model.GetType(); //獲取泛性的方法列表 MethodInfo[] mthodInfos = objType.GetMethods(); //循環(huán)方法 foreach (var item in mthodInfos) { //獲取方法的所有參數(shù)列表 var parameters = item.GetParameters(); //過濾沒用方法 //1:查看是不是有參數(shù)的方法 //2:查看這個(gè)方法的返回類型是不是我們想要的 //3:查看這個(gè)方法的返回類型是不是我們想要的 if (parameters.Any() && parameters[0].ParameterType == typeof(int) && item.ReturnType != typeof(void)) { //調(diào)用方法 object[] parametersObj = new object[] { 5 }; //調(diào)用實(shí)例方法 //第一個(gè)參數(shù)是我們的實(shí)體,后面是我們的參數(shù)(參數(shù)是一個(gè)數(shù)組,多個(gè)參數(shù)按照順序來傳遞,沒有參數(shù)可以為null) //如果我們的方法是一個(gè)靜態(tài)方法 ,這個(gè)參數(shù)可以為null (不是靜態(tài)的就會(huì)報(bào)錯(cuò)) Console.WriteLine(item.Invoke(model, parametersObj)); } } }
6.DataTable轉(zhuǎn)Model(List)
在剛剛學(xué).net 的時(shí)候,我們從數(shù)據(jù)庫查詢出一個(gè)DataTable的時(shí)候想要轉(zhuǎn)成Model或者LIst的時(shí)候我們需要手動(dòng)的寫遍歷,超級(jí)麻煩(在沒有接觸MVC的時(shí)候我就是)
/// <summary> /// DataTable轉(zhuǎn)換 /// </summary> public class TransitionDataTable { /// <summary> /// DataTable轉(zhuǎn)換模型 /// </summary> /// <typeparam name="T">模型類型</typeparam> /// <param name="obj">模型</param> /// <param name="data">數(shù)據(jù)行</param> /// <returns></returns> public T DataSetBindModel<T>(T obj, DataTable data) where T : class, new() { T result = new T(); foreach (DataRow item in data.Rows) { result = assignmentClass(obj, item); } return result; } /// <summary> /// DataTable轉(zhuǎn)換List /// </summary> /// <typeparam name="T">模型類型</typeparam> /// <param name="obj">模型</param> /// <param name="data">數(shù)據(jù)行</param> /// <returns></returns> public List<T> DataSetBindList<T>(T obj, DataTable data) where T : class, new() { List<T> result = new List<T>(); foreach (DataRow item in data.Rows) { result.Add(assignmentClass(obj, item)); } return result; } /// <summary> /// DataRow 轉(zhuǎn)換成模型 /// </summary> /// <typeparam name="T">模型類型</typeparam> /// <param name="obj">模型</param> /// <param name="row">數(shù)據(jù)行</param> /// <returns></returns> private T assignmentClass<T>(T obj, DataRow row) where T : class, new() { if (obj == null) { obj = new T(); } Type type = obj.GetType(); //得到類型的所有屬性,也就是表對(duì)應(yīng)的實(shí)體模型的所有屬性 //嗮選一下只要公開的 PropertyInfo[] properts = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); if (properts.Any()) { foreach (PropertyInfo item in properts) { if (row.Table.Columns.IndexOf(item.Name) != -1) { if (row[item.Name] != null && row[item.Name] != DBNull.Value) { item.SetValue(obj, row[item.Name]); } } } } return obj; } }
調(diào)用
static void Show() { DataTable data = new BDHelper().GetData("select * from Jack_News_TNews"); News news = new News(); var list = new TransitionDataTable().DataSetBindList(news, data); }
聯(lián)系客服