如何使用反射来实例化基于xml文件中文本的新类
本文关键字:中文 文件 文本 新类 xml 反射 何使用 实例化 | 更新日期: 2023-09-27 17:53:01
我有一个基本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);