c# 反射

//0、动态加载 程序集 文件 利用Assembly类

Assembly assembly = Assembly.LoadFile("c:	est.dll");
Type[] type = assembly.GetTypes(); //私有,公有所有类都能获取到
Type type_single = assembly.GetType("test.person"); //只拿到 指定的类 参数为“完全限定名称”。即 命名空间.类名
Type[] type_public = assembly.GetExportedTypes(); //只获取 公有 类型

//1、获取Type类型 两种方式

Person p=new Person ();
Type type1 = p.GetType(); //当有对象的时候 使用GetType
Type type2 = typeof(Person);//当没有对象的时候 使用typeof

//2、获取类型元数据 中的所有方法 (获取所有Public方法。包括属性方法和父类继承下来的方法。不包括私有方法。要获取私有方法需要使用其他方式)

MethodInfo[] methods=type2.GetMethods();
for (int i = 0; i < methods.Length; i++)
{
Console.WriteLine(methods[i].Name.ToString());
}

//调用方法 第一个参数需要通过反射创建对象

MethodInfo method_single = type2.GetMethod("SayHi"); //如果方法重载 则需要type2.GetMethod("SayHi",new Type[]{typeof(int),typeof(string)})
object obj = Activator.CreateInstance(type2); //第一个参数
object result = method_single.Invoke(obj, new object[] { 100, 200 }); //利用Invoke方法 带参数调用,不带参数 method_single.Invoke(obj,null);

//3、获取 类型元数据 中的所有属性

PropertyInfo[] properties= type2.GetProperties();
for (int i = 0; i < properties.Length; i++)
{
Console.WriteLine(properties[i].Name.ToString());
}
//属性赋值
PropertyInfo property = type2.GetProperty("Name");
object obj2 = Activator.CreateInstance(type2); //第一个参数
property.SetValue(obj2,"刘志新",null);
property.GetValue(obj2, null);//获取属性

//4、获取 类型元数据中 所有字段 (私有的获取不到)

FieldInfo[] fields=type2.GetFields();
for (int i = 0; i < fields.Length; i++)
{
Console.WriteLine(fields[i].Name.ToString());
}

//5、类中还有好多的东东,都可以通过.get 来获取。自己看吧

原文地址:https://www.cnblogs.com/crhdyl/p/4902967.html