65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 XML 动态加载对象

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (2投票s)

2011年6月25日

CPOL

1分钟阅读

viewsIcon

16609

downloadIcon

185

此帖子讨论使用 XML 动态加载对象。

本文目标

在本文中,我尝试使用 XML 在运行时动态实例化对象。这个概念并不新颖。Unity Framework 和 Spring framework 使用类似的技术在运行时创建对象实例。

在这里,我尝试创建一个自定义的方法来做类似的事情。为了在运行时创建实例,我使用 Activator.CreateInstance 方法。更多信息可以在以下链接中找到

让我们进入代码。

我创建了一个名为 ClassA 的示例类。

类的代码如下所示

public class ClassA
    {
            private int factor;
            public ClassA()
            {
            }

            public ClassA(int f)
            {
              factor = f;
            }

            public int SampleMethod(int x)
            {
                Console.WriteLine("\nExample.SampleMethod({0}) executes.", x);
                return x * factor;
            }
    }

然后我继续创建一个名为 Container 的类。这个类将执行从 XML 读取类名的操作,以便我创建该类的实例。我有一个 static 方法 Createinstance() ,它将为我执行此任务。

使用 XmlTextReader,我读取 XML。然后使用反射的概念,我尝试读取 Assembly 名称。我解析 XML 以读取 Name 属性。供您参考,XML 的结构如下

Sample.xml
-----------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8" ?>
<Object type="Class" Name="XMLReader.ClassA"></Object>

注意:对于 Name 属性,我提供完全限定名称,即 AssemblyName.ClassName (XMLReader.ClassA)

Container 类的代码如下所示

public static  class Container
    {
      public static Type CreateInstance()
      {
          XmlTextReader reader = new XmlTextReader("C:\\SimpleDI\\XMLReader\\XML\\Sample.xml");
          Assembly assem = Assembly.GetExecutingAssembly();

          AssemblyName assemName = assem.GetName();
          Console.WriteLine(assemName);

          while (reader.Read())
          {
              switch (reader.NodeType)
              {

                  case XmlNodeType.Element: // The node is an Element

                      Console.WriteLine("Element: " + reader.Name);

                      Type type = null;
                      while (reader.MoveToNextAttribute()) // Read attributes

                          if (reader.Name == "Name")
                          {
                              type = assem.GetType(reader.Value); // typeName is a string
                          }

                      return type;
              }
          }

          reader.Close();
          Console.ReadLine();
          return null;
      }
    }

最后在 Program.cs 中,我尝试创建对象实例,如下面的代码所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml; // Imported for XMLTextReader

using System.Reflection;

namespace XMLReader
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly assem = Assembly.GetExecutingAssembly();

            AssemblyName assemName = assem.GetName();
            Console.WriteLine(assemName);

            object obj = Activator.CreateInstance( Container.CreateInstance());


            MethodInfo m = Container.CreateInstance().GetMethod("SampleMethod");
            Object ret = m.Invoke(obj, new Object[] { 42 });
            Console.ReadLine();
        }
    }
}

程序的输出如下所示

DynamicLoading_XML/image001.jpg

© . All rights reserved.