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

时间:2012-09-24 01:29:35

标签: c# wpf reflection

我使用Chart类WPFToolKit,我想通过String调用Construtors以缩短下面的代码

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[]{});

但奇怪的是,类型总是为空,我不是为什么。有人能告诉我吗? 感谢。

2 个答案:

答案 0 :(得分:6)

如果您的类具有公共默认构造函数,则可以使用Activator.CreateInstance(Type.GetType("your type"))。但请确保为其提供完整的类型名称(名称为“System.Int64”)。

参考:http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

更新:

如果类型在另一个程序集中,请参阅this SO question以了解如何获取该类型。

答案 1 :(得分:2)

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

以下是有关它的文档: “要获取的类型的程序集限定名称。如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。”

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

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

(我用Console.WriteLine(typeof(string).AssemblyQualifiedName);

得到了