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

phy*_*ler 5 .net c# reflection

我正在使用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
    }
Run Code Online (Sandbox Code Playgroud)

在这段代码之后,我可以使用复制构造函数从更通用的查询对象中创建一个sonOfObject.但是,如何根据子类的名称动态地执行此操作?

我知道你可以从一个类型中获取MethodInfo并调用它ala ...

MethodInfo m = t.GetMethod(someName);
m.Invoke(yourObj, null);
Run Code Online (Sandbox Code Playgroud)

但这意味着我必须实例化这些子类对象中的9个或10个(并获取每个类对象的类型),并且仍然以某种case语句结束.

是否有更优雅的方式来动态调用子类构造函数?

Dav*_*vid 7

Activator.CreateInstance允许您将类名作为字符串传递,它将返回该类的新实例.


Dan*_*ker 4

为了让一个类参与这个方案,我用一个自定义属性来标记它,这给它一个“XML 名称”。

然后使用反射找到所有标Type有该属性的 s 并将它们放入Dictionary<string, Type>. 此时,您需要决定如何查找可能为系统贡献类型的其他程序集。一个简单的方法是在同一目录中查找扩展名为 .DLL 的其他文件。

然后,只要您想要使用 XML 中的字符串来创建相应的实例,只需在by name中Type查找并调用and即可。TypeDictionaryType.GetConstructorConstructorInfo.Invoke

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