反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。
下面通过一个例子来说明反射的基本用法
一. 创建一个类库(ReflectionTest)
新建类(JsFile.cs)
public class JsFile
{
public static string JQuery = "public/js/common/jquery-1.11.3.min.js";
public static string helper = "public/js/common/helper.js";
public static string category = "public/js/category/categoryIndex.js";
public string categoryColor = "public/js/category/categoryColor.js";
public string GetName(string name)
{
return "Hello:" + name;
}
}
这时候在控制台程序里面添加引用这个类库,利用反射获取这个类库的信息
二. 主程序入口代码
static void Main(string[] args)
{
//获取程序集
Assembly asb = Assembly.LoadFrom(Directory.GetCurrentDirectory() + "/ReflectionTest.dll");
//Assembly asb = Assembly.Load("ReflectionTest");
//获取ReflectionTest程序集下面的所有类
Type[] typeClasses = asb.GetTypes();
//Type document = asb.GetType("ReflectionTest.JsFile"); //获取指定的类
foreach (Type typeClass in typeClasses)
{
//实例化类对象(有参数的话需要传递object参数)
object docObj = Activator.CreateInstance(typeClass);
//获取类里面的所有属性
FieldInfo[] fieldsInfo = typeClass.GetFields();
//FieldInfo fieldInfo = typeClass.GetField("JQuery"); //获取指定属性的信息
foreach (FieldInfo item in fieldsInfo)
{
Console.WriteLine(item.GetValue(docObj));
}
//获取类里面的所有方法
MethodInfo methodInfo = typeClass.GetMethod("GetName");
//MethodInfo[] methodsInfo = typeClass.GetMethods(); //获取所有方法
//参数
object[] parameter = new object[] { "mike" };
Console.WriteLine(methodInfo.Invoke(docObj, parameter).ToString());
}
Console.ReadKey();
}
三. 运行效果