首页 文章

从字符串创建类的实例

提问于
浏览
192

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

9 回答

  • 4

    看一下Activator.CreateInstance方法 .

  • 54

    它非常简单 . 假设您的类名是 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 将为null . 在这种情况下,您循环遍历所有程序集并找到 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;
     }
    

    现在,如果你想调用 parameterized constructor ,请执行以下操作

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

    代替

    Activator.CreateInstance(t);
    
  • -9

    我成功地使用了这个方法:

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

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

  • 3

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

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

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

  • 52

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

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

  • 19

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

    也许你正试图做一些具有可扩展性的东西,在这种情况下我建议你查看Managed Extensibility Framework .

  • 3

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

  • 147

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

    var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");
    
  • 0
    ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
    

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

    ReportClass report = new ReportClass();
    

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

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

相关问题