从字符串创建类的实例

时间:2008-10-21 23:38:05

标签: c# .net instantiation system.type

有没有办法根据我在运行时知道类的名称来创建类的实例。基本上我会在字符串中使用该类的名称。

9 个答案:

答案 0 :(得分:148)

查看Activator.CreateInstance方法。

答案 1 :(得分:57)

非常简单。假设您的类名为Car且命名空间为Vehicles,然后将参数传递为Vehicles.Car,返回类型为Car的对象。像这样,您可以动态创建任何类的任何实例。

public object GetInstance(string strFullyQualifiedName)
{         
     Type t = Type.GetType(strFullyQualifiedName); 
     return  Activator.CreateInstance(t);         
}

如果您的Fully Qualified Name(即本例中为Vehicles.Car)位于另一个程序集中,则Type.GetType将为空。在这种情况下,您循环遍历所有程序集并找到Type。为此,您可以使用以下代码

public object GetInstance(string strFullyQualifiedName)
{
     Type type = Type.GetType(strFullyQualifiedName);
     if (type != null)
         return Activator.CreateInstance(type);
     foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
     {
         type = asm.GetType(strFullyQualifiedName);
         if (type != null)
             return Activator.CreateInstance(type);
     }
     return null;
 }

现在,如果您想调用参数化构造函数,请执行以下操作

Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type

而不是

Activator.CreateInstance(t);

答案 2 :(得分:52)

我成功使用了这个方法:

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)

您需要将返回的对象强制转换为所需的对象类型。

答案 3 :(得分:20)

可能我的问题应该更具体。我实际上知道字符串的基类,所以解决了它:

ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));

Activator.CreateInstance类有各种方法以不同的方式实现相同的功能。我可以把它投射到一个物体上,但上面对我的情况最有用。

答案 4 :(得分:4)

我知道我已经迟到了...但你正在寻找的解决方案可能是上述的解决方案,并使用界面来定义对象可公开访问的方面。

然后,如果以这种方式生成的所有类都实现了该接口,则可以将其转换为接口类型并使用生成的对象。

答案 5 :(得分:3)

您似乎已经描述了要实施的解决方案,但不是您要解决的问题。

也许您正在尝试使用可扩展性做某些事情,在这种情况下,我建议您查看Managed Extensibility Framework

答案 6 :(得分:3)

例如,如果您将各种类型的值存储在数据库字段中(存储为字符串)并且具有另一个具有类型名称的字段(即String,bool,int,MyClass),那么从该字段数据中,您可以可以想象,使用上面的代码创建任何类型的类,并使用第一个字段中的值填充它。这当然取决于您存储的类型,其具有将字符串解析为正确类型的方法。我已经多次使用它来将用户首选项设置存储在数据库中。

答案 7 :(得分:2)

要从解决方案中的另一个项目创建类的实例,可以获取由任何类的名称指示的程序集(例如BaseEntity)并创建一个新实例:

  var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");

答案 8 :(得分:-9)

ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));

为什么你想写这样的代码?如果您有一个类'ReportClass'可用,您可以直接实例化它,如下所示。

ReportClass report = new ReportClass();

当您没有必要的类可用时,使用代码ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));,但您想要动态实例化和/或调用方法。

我的意思是,当你知道程序集时,它是有用的,但在编写代码时,你没有可用的类ReportClass