反射的理解(含一点xml)

 我理解的反射,大概就是各种“找找找”。以下“类名”,均为Type类型(由“名称空间.类名”构成)。

  1. 根据类对象,找到类名。
  2. 根据一个字符串,找到类名;
  3. 有了类名,找到它包含的属性、方法。
  4. 有了类名,还可以创建它的实例。
  5. 有了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));//字段内容
            }
原文地址:https://www.cnblogs.com/wanjinliu/p/13100897.html