匿名类:没有名字的类 特点:匿名类不能被引用 只能在创建时用new语句来声明
匿名类型的优势和应用场景:匿名类型提供了一种方便的方法 用来将一组只读属性封装到单个对象中 无需显式定义一个类型
类型名由编译器生成 并且不能在源代码使用 每个属性的类型由编译器推断
可通过new运算符和对象初始值创建匿名类型
匿名类型通常用在select子句中 便于返回源序列中每个对象的属性子集
var隐式类型:隐式类型var是声明变量是无须指定数据类型 编译器会根据赋值判断其数据类型的一种机制
优势在于:通过var这个隐式类型 可以提高开发人员的开发效率 很多时候可以不考虑对象的类型 编译器会自动帮我们判断
匿名方法是C#2.0引入的一个新特性 它允许开发者内联声明自己的函数代码而无须使用委托函数
var 使用规则:var类型的值必须是局部变量或者静态变量
var在声明之前必须初始化 不能为空
var变量不能是一个方法或方法组
不能用来声明参数类型
反射:程序可以访问 反射动态的创建类型的实例 将类型绑定到现有对象 或者从现有对象中获取类型 可以调用类型的方法或访问其字段和属性
反射的优点:
反射提高了程序的灵活性 降低了耦合性 提高了自适应能力 同时也大大提高了程序的复用性
允许程序集和控制任何类的对象 不用提前编码类
反射的缺点:
性能问题,使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码
使用反射会使程序内部逻辑模糊化,程序员在调试代码的时候希望看到清晰的程序逻辑,而反射却绕过了源代码,因此会带来一定的维护性问题,同时反射代码比相应的直接代码更加复杂。
反射使用场景:
有时不知道具体的类型,可以通过dll去得到类的对象
某些特殊方法,传过来的是泛型类,需要通过反射处理某些特殊的业务
通用方法DataTable和List<T>的相互转化时需要用到反射
反射的用途:
允许在运行时查看特性的信息
允许审查集合中的类型 以及实例化这些类型
允许延迟绑定的方法和属性
允许在运行时创建新类型 使用这些类型执行任务
????Type类的属性:
??????? Name 数据类型名
??????? FullName 数据类型的完全限定名(包括命名空间名)
??????? Namespace 定义数据类型的命名空间名
??????? IsAbstract 指示该类型是否是抽象类型
??????? IsArray?? 指示该类型是否是数组
??????? IsClass?? 指示该类型是否是类
??????? IsEnum?? 指示该类型是否是枚举
??????? IsInterface??? 指示该类型是否是接口
??????? IsPublic 指示该类型是否是公有的
??????? IsSealed 指示该类型是否是密封类
??????? IsValueType 指示该类型是否是值类型
????Type类的方法:
??????? GetConstructor(), GetConstructors():返回ConstructorInfo类型,用于取得该类的构造函数的信息
??????? GetEvent(), GetEvents():返回EventInfo类型,用于取得该类的事件的信息
??????? GetField(), GetFields():返回FieldInfo类型,用于取得该类的字段(成员变量)的信息
??????? GetInterface(), GetInterfaces():返回InterfaceInfo类型,用于取得该类实现的接口的信息
??????? GetMember(), GetMembers():返回MemberInfo类型,用于取得该类的所有成员的信息
??????? GetMethod(), GetMethods():返回MethodInfo类型,用于取得该类的方法的信息
??????? GetProperty(), GetProperties():返回PropertyInfo类型,用于取得该类的属性的信息
??? 可以调用这些成员,其方式是调用Type的InvokeMember()方法,或者调用MethodInfo, PropertyInfo和其他类的Invoke()方法。?
用反射生成对象,并调用属性,方法和字段
:
NewClassw nc = new NewClassw();
Type t = nc.GetType();
object obj = Activator.CreateInstance(t);
//取得ID字段
FieldInfo fi = t.GetField("ID");
//给ID字段赋值
fi.SetValue(obj, "k001");
//取得MyName属性
PropertyInfo pi1 = t.GetProperty("MyName");
//给MyName属性赋值
pi1.SetValue(obj, "grayworm", null);
PropertyInfo pi2 = t.GetProperty("MyInfo");
pi2.SetValue(obj, "hi.baidu.com/grayworm", null);
//取得show方法
MethodInfo mi = t.GetMethod("show");
//调用show方法
mi.Invoke(obj, null);