C# 反射

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

执行第一个模块运行结果如下

这里写图片描述

注释掉第一第三模块,执行第二模块如下

这里写图片描述

注释掉 第一二模块,执行第三模块如下

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值