C# 反射
反射是 .NET 的重要机制,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息
举个例子:给你一个 DLL,你不知道里边都定义了什么类型,每个类型都有什么方法,这时就可以通过反射获取到这个DLL中你可以使用的所有类、看到类中变量和方法,以及实例化类,调用类中方法。
下面以代码为例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace RelectionPro
{
public class Car
{
public string _name;
public Car() { }
public void Prit()
{
Console.WriteLine("name " + _name);
}
public void PirtT(string name)
{
Console.WriteLine("name " + name);
}
public static void PritTT(string name)
{
Console.WriteLine("name " + name);
}
}
class Program
{
static void Main(string[] args)
{
#if true
//获取当前执行代码的程序集
Assembly assembly = Assembly.GetExecutingAssembly();
Console.WriteLine("程序集全名 :" + assembly.FullName);
Console.WriteLine("程序集版本 :" + assembly.FullName);
Console.WriteLine("程序集初始位置 :" + assembly.FullName);
Console.WriteLine("程序集位置 :" + assembly.FullName);
Console.WriteLine("程序集入口 :" + assembly.FullName);
Type[] types = assembly.GetTypes();
Console.WriteLine("程序集包含的类型");
foreach (var item in types)
{
Console.WriteLine("类: " + item.Name);
}
#endif
#if false
//通过路径获取程序集合
Console.WriteLine("路径 : " + AppDomain.CurrentDomain.BaseDirectory);
Assembly assem = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "\\Mono.Data.dll");
Console.WriteLine("程序集全名 :" + assem.FullName);
Console.WriteLine("程序集版本 :" + assem.FullName);
Console.WriteLine("程序集初始位置 :" + assem.FullName);
Console.WriteLine("程序集位置 :" + assem.FullName);
Console.WriteLine("程序集入口 :" + assem.FullName);
Type[] typess = assembly.GetTypes();
Console.WriteLine("程序集包含的类型");
foreach (var item in typess)
{
Console.WriteLine("类: " + item.Name);
}
#endif
#if false
Type type = typeof(Car);
Console.WriteLine("类型名 :" + type.Name);
Console.WriteLine("类全名 :" + type.Name);
Console.WriteLine("命名空间 :" + type.Name);
Console.WriteLine("程序集合 :" + type.Name);
Console.WriteLine("模块名 :" + type.Name);
Console.WriteLine("基类名 :" + type.Name);
Console.WriteLine("是否类 :" + type.Name);
Console.WriteLine("类的公共成员 :" + type.Name);
//获取公共成员
MemberInfo[] memberInfo = type.GetMembers();
foreach(var item in memberInfo)
{
//输出类中所有的公共变量和公共方法
Console.WriteLine("{0} : {1}", item.MemberType, item);
}
//创建实例
object car = Activator.CreateInstance(type);
//获取 Prit 方法
MethodInfo prit = type.GetMethod("Prit");
//调用 prit 方法,
//参数1 类对象,
//参数2 方法参数,无参数可写为 null
prit.Invoke( car, null);
MethodInfo pritT = type.GetMethod("PirtT");
//pritT方法有一个参数,
//调用方法时必须将参数传递进来,参数规范 new object[]{"宝马", .., ..,}
pritT.Invoke(car, new object[]{"宝马"});
MethodInfo pritTT = type.GetMethod("PritTT");
// pritTT 方法为静态方法,所以 第一个参数为 null
pritTT.Invoke(null, new object[] { "奔驰" });
#endif
Console.Read();
}
}
}
执行第一个模块运行结果如下
注释掉第一第三模块,执行第二模块如下
注释掉 第一二模块,执行第三模块如下