使用 XML 动态加载对象





3.00/5 (2投票s)
此帖子讨论使用 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();
}
}
}
程序的输出如下所示