反射:是编程的读取与类型相关联的元数据的行为,通过读取元数据,可以了解它是什么类型以及类型的成员。所属命名空间System.Reflection

使用反射的步骤:加载程序集 Assembly ass= Assembly.LoadFile("路径" );

      2 获取它中的类型 Type type=ass.GetType("类名");

      3 创建一对象 object obj=ass.CreateInstance("类名");

             4. 获取成员或方法 MethodInfo meth=type.GetMethod("方法名");

使用获取的方法或成员 meth.Invoke(obj,null);

在创建对象的步骤中可以使用另一种方法:调用起构造函数来创建实例对象

    调用无参的构造函数   

 3 创建对象 ConstructorInfo con=type.GetConstructor(new Type[0]);

                Object obj=con.Invoke(null);

调用有参的构造函数

创建对象 

//构造函数有参,类型为int

ConstructorInfo con=type.GetConstructor(new Type[]{typeof(int)});

//传入构造函数的实参到对象

Object obj=con.Invoke(new object[]{1});

特性  以两种形式出现:一种是在CLR中定义的属性,另一种可以创建的用于向代码中添加附近信息的自定义属性。

自定义属性 特性类实例化时需要放在[  ]中,语法为:

自定义属性的名称(定位参数1,……命名参数1……)]

定位参数取决于选择的构造器,有参时,不能省略。命名参数可以省略。定位参数和命名参数只可以的数据类型:×××,浮点型,字符,boolobjectTypestring,枚举,以前类型的一维数组。

通过定义的属性类,可以创建自己的自定义属性,该类直接或间接的从System. Attribute派生,如:

[System.AttributeUsage(System.AttributeTargets.Class|System.AttributeTargets.Struct,AllowMultiple=true ,Inherited =true ) ]

public class AuthorAttribute : System.Attribute

{}

使用的时候

[Author()]

Public class Demo

{}

另两个属性:Conditional(条件方法必须是类或结构声明中的方法,而且必须具有 void 返回类型)             Obsolete(过期属性设置)

实例:自动生成SQL语句

序列化 是将对象转换为可保持或传输的形式的过程。序列化的补集是反序列化,后者是将流转换为对象。这两个过程一起爆炸数据易于存储和传输。

两个序列化技术:

二进制序列化:保持类型保真,通过将对象序列化到剪贴板,在不同的应用程序之间共享对象。可以将对象序列化到流、磁盘、内存和网络。远程处理使用序列化,按值在计算机或应用程序域之间传递对象。序列化的过程中,对象的公共字段和私有字段以及类的名称,将转换成字节流,接着写入数据流。随后在进行反序列化时,将创建原始对象的准确克隆。引入的命名空间System.Runtime.Serialization;  System.Runtime.Serialization.Formatters.Binary;

XML序列化:只序列化公共属性和字段,不保持类型保真。

基本序列化

序列化的步骤:创建对象 如Person  P1=new  Person();

  2 创建格式对象 IFormatter  formatter = new  BinaryFormatter();

  3 创建流 Stream  stream = new  FileStream(相对应的参数);

  4 开始进行序列化 formatter.Serialize(stream, P1);

  5 关闭流  stream.Close();

反序列化步骤:创建格式对象 IFormatter formatter = new BinaryFormatter();

  2 创建流 Stream stream = new FileStream(相对应的参数);

  3 反序列化 Person  p2=(Person)formatter.Deserialize(stream);

  4. 关闭流 stream.Close();

选择序列化

只能对字段进行

自定义序列化

通过控制序列化,可以确保序列化兼容性,就是在不中断类型核心功能的情况下,在类型不同 的版本直接序列化合反序列化。

若使用[ Serializable ]属性对某个类进行标记,则该类必须始终实现ISerializable 接口。实现 ISerializable 涉及到实现 GetObjectData 方法以及反序列化对象时所用的特殊构造函数。

[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]——序列化可以允许其他代码查看或修改用其他方式无法访问的对象实例数据,本属性就是安全访问权限的设置