c#反射机制
反射是.NET中的重要机制,通过反射就可以在运行时获得程序或程序集中的每一个类型(包括 类,结构,委托,接口,和枚举)的成员信息。 还可以直接创建对象
1. Type 类 获取某个类型的详细信息的类,
- typeof Type t1=typeof(string);
- s.GetType() string s=”hello”; s.GetType();
- Type.GetType()参数是某个类型的完全限定名 Type t3=Type.GetType(“System.String”)
2. MemberInfo[]mi=t1.GetMembers();可以很明显的从GetMembers()看出,获取的是类中的所有成员,所以返回值类型一定是可以存储多个数据的类型。所以就是一个MemberIbfo类型的数组。数组中的成员包含,MemberType Name 等多个属性
MemberInfo[] mis = t1.GetMembers();
foreach (var item in mis)
{
Console.WriteLine("Name{0}",item.Name);
}
- 获取构造函数
ConstructorInfo[] cis = t.GetConstructors();
foreach (var item in cis) 获取的是所有的构造函数
{
Console.WriteLine(item);
// 获取构造函数的参数
foreach (var it in item.GetParameters())
{
//输出构造函数的参数的类型
Console.WriteLine(it.ParameterType);
}
}
- 用Type 类型的数组存储参数列表 和普通的数组一样,可以用多种方式初始化
Type []ps = new Type [5];
ps[0] = typeof(string);
ps[1] = typeof(int);
ps[2] = typeof(double);
ps[3] = typeof(double);
ps[4] = typeof(double);
ConstructorInfo ci = t.GetConstructor(ps);//根据ps表示的参数列表获取构造函数
ParameterInfo[] pi = ci.GetParameters();获取构造函数中的参数信息
foreach (var item in pi)
{
Console.WriteLine(item.ParameterType+" "+item.Name);
}
//在写的时候要脑子里清楚是获取的什么东西,多个就用数组,单个就直接接收
- 定义参数列表 调用构造函数进行初始化
object[] parmeters = { "zhangsan", 20, 78, 88, 98 };
// NewClass nc = (NewClass)ci.Invoke(parmeters);
//通过activator的CreateInstance 方法创建对象,
//第一个参数是对象的类型,后边的参数是构造函数的参数
//根据构造函数参数自动选择对应的构造函数 不写参数的话默认调用无参的构造函数
object o = Activator.CreateInstance(t, "zhangsan", 20, 89, 98, 88);
((NewClass)o).print();
object o1 = Activator.CreateInstance(t);
((NewClass)o1).print();
}
- 创建对象
object o = Activator.CreateInstance(t);//创建实例 o 就是一个实例对象,
获取属性
c#
PropertyInfo pi_name=t.GetProperty("Name");
PropertyInfo pi_age = t.GetProperty("Age");
设置属性的值
pi_name.SetValue(o, “ffffff”);//setValue
获取属性的值
Console.WriteLine(pi_age.GetValue(o)) 需要添加程序集
/*Assembly ass = Assembly.Load("library"); Type[] t = ass.GetTypes();//获取所有的类 //使用loadFrom或LoadFile时,不需要将程序集添加到工程中来 //可以直接通过文件的路径来加载程序集 //Loadfill不会添加程序集依赖的资源,只添加该程序及本身 //Loadfrom会添加程序集依赖的所有程序集