我理解的反射,大概就是各种“找找找”。以下“类名”,均为Type类型(由“名称空间.类名”构成)。
- 根据类对象,找到类名。
- 根据一个字符串,找到类名;
- 有了类名,找到它包含的属性、方法。
- 有了类名,还可以创建它的实例。
会了这几点,应该就算是会了反射。怎么用,就看你自己的理解了。
对于1、3,的应用,例子可以参考另一篇文章。
对于2、4的应用,例子如下:
using System; using System.Reflection; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string s; //当前程序集 //mynamespace = Assembly.GetEntryAssembly().GetName().Name; Console.WriteLine("输入名称空间名称"); s = Console.ReadLine(); s += "."; Console.WriteLine("输入类名称"); s += Console.ReadLine(); //得到类名,取程序集,创建对象 var o = (MyClass.MyObject)Type.GetType(s).Assembly.CreateInstance(s); o.show(); } } } namespace MyClass { public interface MyObject { public void show(); } public class Test:MyObject { int x; public Test() { x = 66; } public void show() { Console.WriteLine($"Assembly is {Assembly.GetEntryAssembly().GetName().Name},x={x}"); } } }
运行结果: