如何在C#中从字符串创建实例?

时间:2009-03-15 17:11:03

标签: c# reflection

我正在从XML中读取信息,其中包含我需要实例化的对象类型及其构造函数参数。

对象类型实际上位于兄弟命名空间内的另一个项目中。 (我需要在Company.Project1类中创建一个Company.Project2.Type。)

我找到了this question,但它没有处理构造函数参数或它在另一个名称空间中的事实。

我该怎么做?

编辑:项目属性中未正确设置程序集名称和默认名称空间。

2 个答案:

答案 0 :(得分:30)

  • 您需要指定Type.GetType()的完整类型名称,包括名称空间,例如“Company.Project2.Type”
  • 如果类型不在同一个程序集(或mscorlib)中,则还需要提供程序集名称,包括强类型的版本信息。例如,对于非强类型程序集Company.Project2.dll,您可以指定“Company.Project2.Type,Company.Project2”。
  • 要使用参数调用构造函数,您可以调用Activator.CreateInstance(Type, Object[])或使用Type.GetConstructor()获取所需的确切构造函数,然后调用ConstructorInfo.Invoke()

如果这没有帮助,请提供更多信息。

答案 1 :(得分:2)

如果要在运行时动态创建类型,Activator.CreateInstance方法将为您完成。如果发出的是具有带参数的构造函数的类型,则此重载将执行此操作。 例如, http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx

我建议通过重载查看最佳匹配。

命名空间问题应该不是相关的 - 只要dll在bin目录或GAC中就可以了。如果程序集名称很强,则规则可能会更改。

您是否可以提供无效代码的代码片段(使用您链接的方法)?这+你看到的错误将非常有帮助! [更新] 快速示例使用Activator.CreateInstance处理带有参数的构造函数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseProduct b =(BaseProduct)System.Activator.CreateInstance(Type.GetType("ConsoleApplication1.Product")
                ,new object[]{typeof(string)}, 
                new object[]{"123"}
            );
            //Activator..::.CreateInstance Method (Type, array<Object>[]()[], array<Object>[]()[])
        }
    }
    public class Product: BaseProduct{
        public  Product(string id) { 

        }
        public string Id {get;set;}


   }

    public abstract class BaseProduct {
        abstract public string Id { get; set; }
    }
}