如何使用反射来实例化基于xml文件中文本的新类



我有一个基本Question类和许多从该类派生的类,如CheckboxQuestion类和RadioButtonQuestion

该程序对问题标签内的每个块的xml代码进行迭代,它将根据标签的名称生成一个新元素,并且是问题类的子类

        <question number="1">
            <RadioButtonQuestion>
                <title>What is the right ...</title>
                <choices>
                    <choice value="1">answer 1</choice>
                    <choice value="2">answer 2</choice>
                    <choice value="3">answer 3</choice>
                    <choice value="4">answer 4</choice>
                </choices>
            </RadioButtonQuestion>
        </question>

在迭代了所有的xml文件后,我想把所有的问题都放在IEnumerable<Questions>中,问题是我不知道如何根据xml文档

中写的文本创建一个新的类

如果XML标记直接反映类的名称,则可以使用Type.GetType()来确定相应的类型-请记住,它需要完整的命名空间(下面示例中的"Test"(。然后可以使用Activator.CreateInstance()创建该类型的实例。

string xmlTagName = "RadioButtonQuestion";
Type type = Type.GetType("Test." + xmlTagName );
var question = Activator.CreateInstance(type);

还要记住,Activator.CreateInstance()返回object。如果您根据标记名称确定正确的类型,然后以老式的方式实例化实例,总体来说可能会更好。

假设类型都在当前执行的程序集中,这应该按名称实例化类,而不需要switch语句:

public object InstantiateClass(string name, params object[] args)
{
    return Activator.CreateInstance(this.GetType().Assembly.FullName, name, args);
}
 switch(input)
 {
      case optionA:
          return Activator.CreateInstance(typeof(Bla));
      case optionB:
          return Activator.CreateInstance(typeof(Blb));
 }

0.02美元/年

Bla/Blo构造函数的任何额外参数都可以添加

Activator.CreateInstance(typeof(Bla), 1, 2 ,3);

实际上,它需要一个对象的params数组。因此,如果您需要动态传递它们,

object[] dynparams = new object[] { 1,2, "more", 4.5, new List<int>() };
...
return Activator.CreateInstance(typeof(Bla), dynparams);

存在许多其他过载,请在此处阅读

现在我不知道你的任何字体名称,但你可以做

Object obj = Activator.CreateInstance(null, "Namespace1.MyClass1", dynparams);

最新更新