我正在使用LINQ-to-XML查询文件以获取对象列表。它们都具有相同的结构(一定数量的选项,不确定长度的参数列表)。基于XML文件中它们的名称,我想将参数用于完全不同的事物-因此我创建了该对象的子类。
我的问题是-如何动态调用正确的构造函数,而无需执行case语句之类的操作?还是优雅地从XML实例化不同子类的解决方案在其他地方?
class Object1
{
string name;
OptionObj opt;
List<Param> parameters;
}
class sonOfObject : Object1
{
public void ExecuteSomething()
{
//do something with the parameters
}
}
class secondSonOfObject : Object1
{
public void ExecuteSomething()
{
//do something entirely different with the parameters
}
}
var query = from x in xmlDoc.Descendants("Object")
select new Object
{
//select the object from the XML
}
在这段代码之后,我可以使用复制构造函数从更通用的查询对象中创建sonOfObject。但是,如何根据子类的名称动态地执行此操作?
我知道您可以从类型获取MethodInfo并对其进行调用...
MethodInfo m = t.GetMethod(someName);
m.Invoke(yourObj, null);
但这意味着我将不得不实例化这些子类对象中的9个或10个(并为每个对象获取类型),并且仍然以某种case语句结束。
有没有更优雅的方法来动态调用子类构造函数?
最佳答案
为了使一个类参与此方案,我将使用自定义属性对其进行标记,该属性将为其赋予“XML名称”。
然后使用反射查找所有标记有该属性的Type
,并将它们放在Dictionary<string, Type>
中。在这一点上,您需要决定如何查找可能对系统贡献类型的其他程序集。一种简单的方法是在同一目录中查找扩展名为.DLL的其他文件。
然后,只要您有XML中要用于创建相应Type
实例的字符串,就可以在Type
中按名称查找Dictionary
并调用Type.GetConstructor
和ConstructorInfo.Invoke
。
这样做的好处是XML中的标识符与代码的物理布局是分开的-您可以在程序集中移动类型或重命名它们,而不会使旧的XML文件无效。
关于c# - 如何在C#中动态调用构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/655873/