zoukankan      html  css  js  c++  java
  • 反射的理解(含一点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));//字段内容
                }
  • 相关阅读:
    Sigma Function (LightOJ
    Least Common Multiple (HDU
    七夕节 (HDU
    Goldbach`s Conjecture(LightOJ
    tarjan图论算法
    数论基础(更新中)
    You Are Given a Decimal String... CodeForces
    【UOJ#22】【UR#1】外星人
    【UOJ#21】【UR#1】缩进优化
    【BZOJ3242】【UOJ#126】【NOI2013】快餐店
  • 原文地址:https://www.cnblogs.com/wanjinliu/p/13100897.html
Copyright © 2011-2022 走看看