如何在C#中通过字符串调用构造函数(即通过反射)?

3

我使用 WPFToolKit 的 Chart 类,我想通过字符串调用构造函数来缩短下面的代码。

switch (node.Attributes["type"].Value)
{
    case "ColumnSeries":
        ans = new ColumnSeries();
        break;
    case "PieSeries":
        ans = new PieSeries();
        break;
    case "AreaSeries":
        ans = new AreaSeries();
        break;
    case "BarSeries":
        ans = new BarSeries();
        break;
    case "LineSeries":
        ans = new LineSeries();
        break;
}

在搜索后,我找到了以下代码:

Type type = Type.GetType(node.Attributes["type"].Value);
Console.WriteLine(type == null);
ConstructorInfo ctor = type.GetConstructor(new Type[] { });
object instance = ctor.Invoke(new object[]{});

但奇怪的是,类型始终为null,我不知道为什么。有人能告诉我吗? 谢谢。

尝试使用 Type type = Assembly.GetExecutingAssembly().GetType(node.Attribute["type"].Value); - SimpleVar
似乎问题仍然存在。 - Cuero
如果您无法获取类型的引用,则可以实例化该类型的对象。确保使用正确的类型名称以获取对类型的引用。 - lahsrah
我已经尝试过"System.Windows.Controls.DataVisualization.Charting.ColumnSeries",但还是没有用。我认为这是正确的引用。 - Cuero
现在它可以工作了,因为我需要添加汇编程序。 - Cuero
2个回答

6
如果您的类有一个公共默认构造函数,您可以使用Activator.CreateInstance(Type.GetType("your type"))。但是请确保您提供完整的类型名称(包括命名空间,如“System.Int64”)。
参考:http://msdn.microsoft.com/en-us/library/wccyzw83.aspx 更新:
如果该类型在另一个程序集中,请参考此 SO 问题了解如何获取类型。

我尝试了 object instance = Activator.CreateInstance(Type.GetType("System.Windows.Controls.DataVisualization.Charting.ColumnSeries")); 但它仍然是 "null"。 - Cuero
1
请查看我的回答中的更新。尝试将其程序集名称与完整类型名称一起包括,例如Type.GetType("System.Windows.Controls.DataVisualization‌​.Charting.ColumnSeries, WPFToolkit"); 将"WPFToolkit"替换为您引用的实际dll的名称。 - prashanth

2

Type.GetType需要一个程序集限定名称:

这是相关文档: “要获取的类型的程序集限定名称。如果该类型在当前执行的程序集或Mscorlib.dll中,则只需提供其命名空间限定的类型名称即可。”

这包括类型的命名空间和程序集。 例如,字符串类的程序集限定名称如下所示:

"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

(我通过 Console.WriteLine(typeof(string).AssemblyQualifiedName); 得到了这个结果)


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