网上看了很多关于反射的思路和方法,发现这个还算不错
//使用反射方:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //声明一个反射类对象 Assembly a; //让这个对象加载某个外部dll程序集信息. a = Assembly.LoadFile(@"C:\Users\正月龙\Desktop\Person\Person\bin\Debug\Person.dll"); //反射出该dll程序集的名称信息. Console.WriteLine(a.GetName()); Console.ReadKey(); //定义一个"类型信息"的对象. Type t = a.GetType("Person.Person", false, true); //定义一个成员信息类对象数组,并从程序集中获取. MemberInfo[] info = t.GetMembers(); //逐个返回成员的名字. foreach (MemberInfo inf in info) { Console.WriteLine(inf.Name); } Console.ReadKey(); //定义一个成员方法对象,这里是指定方法名称来获取的. MethodInfo method = t.GetMethod("show"); //定义一个查询构造函数的对象,获取时需给定签名. ConstructorInfo coninfo = t.GetConstructor(new Type[] { typeof(int), typeof(string) }); //这里准备两个参数,封装为一个具有两个对象的数组. object[] arg = new object[2] { 10, "dog" }; //调用构造函数并赋值给一个对象. object o = coninfo.Invoke(arg); //调用对象的方法 method.Invoke(o, null); //这是第二种调用对象的方法.都可以. method.Invoke(o, BindingFlags.Public | BindingFlags.Instance , Type.DefaultBinder, null, null); Console.ReadKey(); } } }
//被查询或被调用方
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Person { public class Person { private int int_a; private string str_a; public Person() { } public Person(int a,string b) { this.int_a = a; this.str_a = b; } public void show() { Console.WriteLine(int_a.ToString()+":"+str_a); Console.ReadKey(); } } }