反射: 这是.Net中获取运行时类型信息的方式, 应用程序由程序集(assembly),模块(module), 类(class)组成.而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息
比如:
Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。
Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。
引用命名空间:using System.Reflection;
反射的核心类:Type
例如:MyClass类
class MyClass
{
public int zoo=1;
public string Name { get; set; }
public void Test(int a)
{
Console.WriteLine(a);
}
public void Test1<T>(T i)
{
Console.WriteLine(i);
}
}
获得属性信息:PropertyInfo
//属性
Type t = typeof(MyClass); //实例化类型
object obj = Activator.CreateInstance(t); //生成对象
var tt = t.GetProperties(); //获取所有属性信息
foreach (var item in tt)
{
item.SetValue(obj, "张三");//属性赋值
Console.WriteLine(item.Name); //查看属性的名称
Console.WriteLine(item.PropertyType.Name); //查看属性的数据类型
Console.WriteLine(item.GetValue(obj));//获取属性的值
}
获得方法信息:MethodInfo
//方法
MethodInfo m = t.GetMethod("Test"); //获得Test方法
object[] Parmets = new object[] { 10 }; //需要传的参数
m.Invoke(obj, Parmets);
//泛型方法
Assembly assembly1 = Assembly.Load("ConsoleApp1"); //加载ConsoleApp1命名空间
Type t1 = assembly1.GetType("ConsoleApp1.MyClass")//ConsoleApp1下的mycalss类;
object obj = Activator.CreateInstance(t1); //实例对象
MethodInfo m = t1.GetMethod("Test1"); //获得Test1的放法
var o = new object[] { 4 }; //参数
var m2 =m.MakeGenericMethod(new Type[] { typeof(int) }).Invoke(obj,o); //调用