.Net之美读书笔记15
.Net反射
.Net 反射为:程序运行时,获取类型的元数据(对类型信息的描述)。这里对反射的应用小节一下。
反射的入口(Type)
Type
为处理反射元数据的类。获取Type
的途径。
Type ty = Type.GetType("System.Int32");
Type type = swim.GetType();
typeof(int);
获取类型的基本信息
获取类型相关的信息:类型名、类型全名、基类名以及对类型的一些判断IsXXX
Type type = typeof(int);
Console.WriteLine(type.Name);
Console.WriteLine(type.FullName);
Console.WriteLine(type.BaseType.Name);
Console.WriteLine(type.IsInterface);
Console.WriteLine(type.IsClass);
获取类型的成员
MemberInfo 包括属性、字段、函数、事件等
MemberInfo[] memberInfo = type.GetMembers();
foreach (MemberInfo mi in memberInfo)
{
Console.WriteLine(mi.Name);
}
Console.WriteLine("********************");
FieldInfo[] fieldInfo = type.GetFields();
foreach(FieldInfo fi in fieldInfo)
{
Console.WriteLine(fi.Name);
}
Console.WriteLine("********************");
PropertyInfo[] propertyInfo = type.GetProperties();
foreach(PropertyInfo pi in propertyInfo)
{
Console.WriteLine(pi.Name);
}
Console.WriteLine("********************");
MethodInfo[] method = type.GetMethods();
foreach (MethodInfo md in method)
{
Console.WriteLine(md.Name);
}
反射创建实体
新建类Person
public class Person
{
public string ID { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public DateTime Birthday { get; set; }
public virtual void Study()
{
Console.WriteLine("I am a person.I must study!");
}
}
- 根据类型动态创建方法1
Type type = typeof(Person);
Assembly asm = Assembly.GetExecutingAssembly();
object obj1 = asm.CreateInstance(type.FullName);
- 方法二
object obj2 = Activator.CreateInstance(null, type.FullName).Unwrap();
- 动态调用方法1
type.InvokeMember("Study", BindingFlags.InvokeMethod, null, obj1, null);
- 动态调用方法二
MethodInfo mi1 = type.GetMethod("Study");
mi1.Invoke(obj2,null);
- 动态修改属性值与取值
PropertyInfo pi1 = type.GetProperty("Name");
pi1.SetValue(obj1, "Hello World!");
Console.WriteLine(pi1.GetValue(obj1));
程序集的反射
获取程序集的方式:Assembly asm = Assembly.LoadFrom("Demo.dll")
.程序集写有模块,通过反射可以得到程序集信息。
特性(Attribute)
- 继承System.Attribute类,要自定义特性类添加Attribute后缀
- 获取属性的自定义特性
GetCustomAttributes()