我理解的反射,大概就是各种“找找找”。以下“类名”,均为Type类型(由“名称空间.类名”构成)。
- 根据类对象,找到类名。
- 根据一个字符串,找到类名;
- 有了类名,找到它包含的属性、方法。
- 有了类名,还可以创建它的实例。
- 有了3,可以获取类对象的属性值。
会了这几点,应该就算是会了反射。怎么用,就看你自己的理解了。
对于1、3,的应用,例子可以参考另一篇文章。
对于2、4的应用,例子如下:
using System; using System.Reflection; using System.Xml; namespace ConsoleApp1 { class Program { static void Main(string[] args) { String s; XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load("myxml.xml"); //下两行效果相同 //s=xmlDocument.SelectSingleNode("myinput/mynamespace").InnerText s = xmlDocument.GetElementsByTagName("mynamespace")[0].InnerText; s += "."; s+= xmlDocument.GetElementsByTagName("myclass")[0].InnerText; //入口程序集(名称) //Assembly.GetEntryAssembly().GetName().Name; //得到类名,取它所在的程序集,创建对象 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}"); } } }
使用了xml文档作为配置,取代了通常用到的输入。手痒而已,不重要。
xml需要设置成复制,不然调试的时候找不到。
文档内容如下:
<?xml version="1.0" encoding="utf-8" ?> <myinput> <mynamespace au="hc">MyClass</mynamespace> <myclass>Test</myclass> </myinput>
运行结果:
对于5,部分代码如下:
StringBuilder sb1, sb2; sb1 = new StringBuilder(); sb2 = new StringBuilder(); myt = obj.GetType(); var myps = myt.GetProperties(); foreach (var item in myps) { sb1.Append(item.Name);//属性名 sb2.Append(item.GetValue(obj, null));//字段内容 }