前言:
现在姐妹们对“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();
所以结果只获得公开的方法和两个属性的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