如何在C#中动态调用构造函数?

5
我正在使用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语句。

有没有更优雅的方法来动态调用子类构造函数?

2个回答

7

4
为了使一个类参与到这个方案中,我会使用自定义属性来标记它,并给它一个“XML名称”。
然后使用反射来查找所有标记有该属性的Type,并将它们放入一个Dictionary中。此时,您需要决定如何找到可能为系统贡献类型的其他程序集。一个简单的方法是在同一目录中查找扩展名为.DLL的其他文件。
然后,每当您有一个要用于创建相应Type实例的XML字符串时,只需按名称在Dictionary中查找Type并调用Type.GetConstructor和ConstructorInfo.Invoke即可。
这样做的好处是,XML中的标识符与代码的物理布局分离 - 您可以在程序集中移动类型或重命名它们,而不会使旧的XML文件无效。

+1 在重新阅读原帖后,我相信这确实是更好的解决方案。 - Andrew Hare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接