龙空技术网

C#之反射

十二先森呐 458

前言:

现在姐妹们对“netmethodinvoke”大致比较注意,同学们都想要了解一些“netmethodinvoke”的相关内容。那么小编在网络上搜集了一些关于“netmethodinvoke””的相关文章,希望姐妹们能喜欢,你们快快来了解一下吧!

反射主要用来和程序集打交道,我们可以通过反射查看和操作元数据。

反射的作用:

1. 加载一个程序集

2. 获得程序集的托管模块

3. 获得程序集的类型对象。通过System.Type返回类型对象,获得类型的成员、方法。还能创建一个新的对象。

4. 获得类型的成员和方法。反射可以获得类型所有的成员和方法,哪怕是私有的。

获得类型的基本信息

class Program{        static void Main(string[] args)        {						 // 可以通过typeof获得类型,是GetType方法的简写            var type = typeof(Book);						// 就可以通过type访问对象的各个属性            Console.WriteLine("命名空间:"+type.Namespace);            Console.WriteLine("父类:"+type.BaseType);            Console.WriteLine("全名:"+type.FullName);            Console.WriteLine("是否为抽象类型:"+type.IsAbstract);            Console.WriteLine("是否是类:"+type.IsClass);            Console.ReadKey();        }    }    public class Book    {        // 字段        private int pageNum;        static string bookName;        protected string author;        // 属性        public double Price { get; set; }        public static string Desc { get; set; }        private Book()        {            Console.WriteLine("构造函数");        }        public  string MethodTest()        {            return "MethodTest...";        }        private int Add(int num)        {            return num + 1;        }}
获得类型的成员和调用方法

获得类型对象之后,可以获得类型的成员:字段、属性、构造函数、方法等。GetMembers默认是获得公开的成员,包括父类的公开成员。

var type = typeof(Book);var members = type.GetMembers();foreach (var item in members){      Console.WriteLine(item.MemberType + "---->" + item.Name);}Console.ReadKey();

GetMembers默认是获得公开的成员

所以结果只获得公开的方法和两个属性的getter和setter,当然还包括父类的公开成员。

要想获得特定的成员,可以传入枚举BindingFlags,指定多个枚举值可以获得多个指定的成员。

Static:静态成员

Instance:实例成员

Public:公开成员

NonPublic:非公开成员

DeclaredOnly:只返回自己类型的成员,不返回父类的

……

例如:获得想获得非公开的实例成员:

var members2 = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance);

为了获得成员,必须包含Static或者Instance至少一个。因为任何一个类型不是实例成员就是静态成员。

如果只想获得方法和属性,可以不使用GetMembers的方式。直接使用GetMethods和GetProperties方法。GetEvents获得事件,GetFields获得所有字段,GetConstructors获得所有构造函数。即使成员是私有的或者受保护的,反射也一样可以获取到,甚至是修改。

var type = typeof(Book);// 加入BindingFlags获得私有构造函数var constructor = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic);// 使用私有构造函数object obj = constructor[0].Invoke(null);// 获得私有方法var method = type.GetMethod("Add", BindingFlags.Instance | BindingFlags.NonPublic);object[] pars = { 0 };// 调用Add方法 object result = method.Invoke(obj, pars);Console.WriteLine(result);Console.ReadKey();
加载程序集

可以用System.Reflection的Assembly类型动态加载程序集,在运行时才创建类型对象。

先Assembly.Load或者LoadFrom找到程序集,然后GetType获得类型,最后Activator.CreateInstance创建类型的实例。

string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ReflectionDemo.exe");// 获得程序集var assembly = Assembly.LoadFile(path);// 获得类型对象var type = assembly.GetType("ReflectionDemo.Book");// 获得私有构造函数var constructor = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic);object obj = constructor[0].Invoke(null);// 获得私有方法var method = type.GetMethod("Add", BindingFlags.Instance | BindingFlags.NonPublic);object[] pars = { 2 };object result = method.Invoke(obj, pars);Console.WriteLine(result);Console.ReadKey();

标签: #netmethodinvoke