我正在使用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.GetConstructorConstructorInfo.Invoke

这样做的好处是XML中的标识符与代码的物理布局是分开的-您可以在程序集中移动类型或重命名它们,而不会使旧的XML文件无效。

关于c# - 如何在C#中动态调用构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/655873/

10-17 00:04