霞天膏,郭明义观后感,调查地沟油的记者死了
2. type类的介绍
成员 | 成员类型 | 描述 |
name | 属性 | 返回类型的名字 |
fullname | 属性 | 返回数据类型的完全限定名(包括命名空间名) |
namespace | 属性 | 返回包含数据类型声明的命名空间 |
assembly | 属性 | 返回声明类型的程序集。如果类型是泛型的,返回定义这个类型的程序集 |
getconstructor(), getconstructors() | 方法 | 返回constructorinfo类型,用于取得该类的构造函数的信息 |
getevent(), getevents() | 方法 | 返回eventinfo类型,用于取得该类的事件的信息 |
getfield(), getfields() | 方法 | 返回fieldinfo类型,用于取得该类的字段(成员变量)的信息 |
getinterface(), getinterfaces() | 方法 | 返回interfaceinfo类型,用于取得该类实现的接口的信息 |
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中基础的方法。
2.gettype()必须要通过类型的实例点出这个方法。
3.1.2 typeof()
1.typeof(xx)是公开的运算符。
2.typeof(xx)中xx只能是int,string 等类型及自定义类型,不能是实例。
3.2 不同点
1.gettype()返回的是type(类型)
2.typeof(xx) 返回的是xx class(类)的类型
1 //实例一个用户类 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对象就可以使用getmethodinfo()方法获取此类型支持的方法列表。该方法返回一个methodinfo 对象数组,methodinfo对象描述了主调类型所支持的方法,他位于system.reflection命名空间中
2: methodinfo类派生于methodbase抽象类,而methodbase类继承了memberinfo类。因此我们能够使用这三个类定义的属性和方法。例如,使用name属性得到方法名称。这里有两个重要的成员:
3: returntype属性 :为type类型的对象,能够提供方法的返回类型信息 getparameters()方法 :返回参数列表,参数信息以数组形式保存在patameterinfo对象中。patameterinfo类定义了大量描述参数信息的属性和方法。这里也列出两个常用的属性 :name(包含参数名称信息的字符串),parametertype(参数类型的信息)。
//创建实例 sublevel sublevel = new sublevel(); //获取类型 type subleveltype = sublevel.gettype(); //获取类型的方法列表 //bindingflags.nonpublic | bindingflags.instance | bindingflags.public 这个有一个注意点 //实际上至少要有instance(或static)与public(或nonpublic)标记。否则将不会获取任何方法。 methodinfo[] obj = subleveltype.getmethods(bindingflags.nonpublic | bindingflags.instance | bindingflags.public); //遍历所有的方法 foreach (methodinfo item in obj) { //返回方法的返回类型 console.write(item.returntype.name); //返回方法的名称 console.write(" "+item.name+"("); //获取方法的返回参数列表 parameterinfo[] parameterss = item.getparameters(); foreach (var parameters in parameterss) { //参数类型名称 console.write(parameters.parametertype.name); //参数名称 console.write(" "+parameters.name+","); } console.writeline(")"); }
执行的结果,获取了所有的方法,包括了方法的方法名称,方法的返回类型,方法参数列表。
5.方法的使用
前面我们讲了放的显示,但是只能看到不能用就不好了呀!!!
5.1:getmethods()方法的另一种形式
这种形式可以制定各种标记,已筛选想要获取的方法。他的通用形式为:methodinfo[] getmethods(bindingflags bindingattr)bindingflags是一个枚举,枚举值有(很多只列出4个吧)
getmethods(bindingflags bindingattr)这个方法,参数可以使用or把两个或更多标记连接在一起,实际上至少要有instance(或static)与public(或nonpublic)标记。否则将不会获取任何方法。del.gettype();
public static void method<t>(t model) { //获取泛性的type类型 type objtype = model.gettype(); //获取泛性的方法列表 methodinfo[] mthodinfos = objtype.getmethods(); //循环方法 foreach (var item in mthodinfos) { //获取方法的所有参数列表 var parameters = item.getparameters(); //过滤没用方法 //1:查看是不是有参数的方法 //2:查看这个方法的返回类型是不是我们想要的 //3:查看这个方法的返回类型是不是我们想要的 if (parameters.any() && parameters[0].parametertype == typeof(int) && item.returntype != typeof(void)) { //调用方法 object[] parametersobj = new object[] { 5 }; //调用实例方法 //第一个参数是我们的实体,后面是我们的参数(参数是一个数组,多个参数按照顺序来传递,没有参数可以为null) //如果我们的方法是一个静态方法 ,这个参数可以为null (不是静态的就会报错) console.writeline(item.invoke(model, parametersobj)); } } }
6.datatable转model(list)
在刚刚学.net 的时候,我们从数据库查询出一个datatable的时候想要转成model或者list的时候我们需要手动的写遍历,超级麻烦(在没有接触mvc的时候我就是)
/// <summary> /// datatable转换 /// </summary> public class transitiondatatable { /// <summary> /// datatable转换模型 /// </summary> /// <typeparam name="t">模型类型</typeparam> /// <param name="obj">模型</param> /// <param name="data">数据行</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转换list /// </summary> /// <typeparam name="t">模型类型</typeparam> /// <param name="obj">模型</param> /// <param name="data">数据行</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 转换成模型 /// </summary> /// <typeparam name="t">模型类型</typeparam> /// <param name="obj">模型</param> /// <param name="row">数据行</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(); //得到类型的所有属性,也就是表对应的实体模型的所有属性 //嗮选一下只要公开的 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; } }
调用
static void show() { datatable data = new bdhelper().getdata("select * from jack_news_tnews"); news news = new news(); var list = new transitiondatatable().datasetbindlist(news, data); }
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
asp.net搭建博客,使用BlogEngine.NET+MySql搭建博客
网友评论