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();

 

最后,目前我对反射的理解和运用还比较浅层,以后会继续学习和使用。

posted @ 2017-06-15 08:05  田云  阅读(284)  评论(0编辑  收藏  举报