C#反射
定义:
.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。
使用:
1、通过System.Type,我们可以获取:
某个类的全名、命名空间、属性等信息。
static void Main(string[] args) { //System.Type string s = "hello refelction"; Type t = s.GetType(); //方法一 Console.WriteLine(t.FullName); Type t2 = Type.GetType("system.String", false, true);//方法二 Console.WriteLine(t2.FullName); Type t3 = typeof(string);//方法三 Console.WriteLine(t3.FullName); Console.ReadKey(); }
效果图:
获取方法名:
//可以通过添加bingflag标志位来筛选方法,public或者instance(不能是静态方法)
static void GetMothods(Type type,BindingFlags f)
{
MethodInfo[] methods = type.GetMethods(f);
foreach (var info in methods)
{
Console.WriteLine(info.Name);
}
}
使用:
GetMothods(typeof (string), BindingFlags.Public | BindingFlags.Instance);
获取属性及字段信息:
static void GetMothods(Type type)
{
MethodInfo[] methods = type.GetMethods();
FieldInfo[] fields = type.GetFields();
PropertyInfo[] propertyInfos = type.GetProperties();
foreach (var info in methods)
{
Console.WriteLine(info.Name);
}
foreach (var fieldInfo in fields)
{
Console.WriteLine(fieldInfo.Name);
}
foreach (var propertyInfo in propertyInfos)
{
Console.WriteLine(propertyInfo.Name);
}
}
class MyClass
{
public string PublicString;
public string PublicProp { get; set; }
public void Gettest()
{
return;
}
}
2、基于程序集的反射
assebly动态加载
namespace Assebly
{
class Program
{
static void Main(string[] args)
{
Assembly assebly;
assebly = Assembly.Load("mscorlib,2.0.0.0,Neutral,b77a5c561934e089");//动态加载
Type[] types = assebly.GetTypes();
//foreach (var type in types)
//{
// //Console.WriteLine(type.Name);
//}
assebly = Assembly.GetExecutingAssembly();//获取正在执行的程序集
Type t = assebly.GetType("Assebly.Car", false, true);//获取类,参数为命名空间加方法名
object obj = Activator.CreateInstance(t);//根据类型创建对象
MethodInfo mi = t.GetMethod("IsMoving");//获取方法
var isMoving = (bool) mi.Invoke(obj, null);//执行
if (isMoving)
{
Console.WriteLine("Is moving");
}
else
{
Console.WriteLine("Not is moving");
}
Console.ReadLine();
}
}
public class Car
{
public bool IsMoving()
{
return true;
}
}
}
3、获取外部程序的元数据:
//获取外部类的元数据 Assembly asmAssembly = Assembly.LoadFile(@"C:\Users\Administrator\Documents\Visual Studio 2013\Projects\test\test1\bin\Debug\test1.exe"); //获取所有类型 Console.WriteLine("获取所有类型"); Type[] types = asmAssembly.GetTypes(); foreach (Type type in types) { Console.WriteLine(type.FullName); } Console.WriteLine("获取pulic类型"); Type[] typePublicTypes = asmAssembly.GetExportedTypes(); foreach (Type type in typePublicTypes) { Console.WriteLine(type.FullName); } //获取指定类型 Console.WriteLine("获取指定类型"); Type methodType = asmAssembly.GetType("test1.Model"); Console.WriteLine(methodType.FullName); //执行无参函数 MethodInfo methodInfo = methodType.GetMethod("method",new Type[]{}); methodInfo.Invoke(Activator.CreateInstance(methodType),null); //重载 MethodInfo methodInfo2 = methodType.GetMethod("method",new Type[]{typeof(string)}); methodInfo2.Invoke(Activator.CreateInstance(methodType),new object[]{"田云"}); //构造函数 ConstructorInfo info = methodType.GetConstructor(new Type[] { typeof (string), typeof (int) }); object obj = info.Invoke(new object[] {"田云", 24}); PropertyInfo NamePro = methodType.GetProperty("Name"); string name = NamePro.GetValue(obj, null).ToString(); Console.WriteLine(name); Console.ReadLine();
最后,目前我对反射的理解和运用还比较浅层,以后会继续学习和使用。
身是菩提树,心如明镜台,时时勤拂拭,勿使惹尘埃。