Create an instance of a class from a string

后端 未结 8 1308
别跟我提以往
别跟我提以往 2020-11-22 02:53

Is there a way to create an instance of a class based on the fact I know the name of the class at runtime. Basically I would have the name of the class in a string.

相关标签:
8条回答
  • 2020-11-22 03:17

    To create an instance of a class from another project in the solution, you can get the assembly indicated by the name of any class (for example BaseEntity) and create a new instance:

      var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");
    
    0 讨论(0)
  • 2020-11-22 03:20

    Its pretty simple. Assume that your classname is Car and the namespace is Vehicles, then pass the parameter as Vehicles.Car which returns object of type Car. Like this you can create any instance of any class dynamically.

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

    If your Fully Qualified Name(ie, Vehicles.Car in this case) is in another assembly, the Type.GetType will be null. In such cases, you have loop through all assemblies and find the Type. For that you can use the below code

    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;
     }
    

    Now if you want to call a parameterized constructor do the following

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

    instead of

    Activator.CreateInstance(t);
    
    0 讨论(0)
  • 2020-11-22 03:21
    ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
    

    why do u want to write a code like this? If you have a class 'ReportClass' is available, you can instantiate it directly as shown below.

    ReportClass report = new ReportClass();
    

    The code ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); is used when you dont have the necessary class available, but you want to instantiate and or or invoke a method dynamically.

    I mean it is useful when u know the assembly but while writing the code you dont have the class ReportClass available.

    0 讨论(0)
  • 2020-11-22 03:25

    Probably my question should have been more specific. I actually know a base class for the string so solved it by:

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

    The Activator.CreateInstance class has various methods to achieve the same thing in different ways. I could have cast it to an object but the above is of the most use to my situation.

    0 讨论(0)
  • 2020-11-22 03:27

    I've used this method successfully:

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

    You'll need to cast the returned object to your desired object type.

    0 讨论(0)
  • 2020-11-22 03:31

    I know I'm late to the game... but the solution you're looking for might be the combination of the above, and using an interface to define your objects publicly accessible aspects.

    Then, if all of your classes that would be generated this way implement that interface, you can just cast as the interface type and work with the resulting object.

    0 讨论(0)
提交回复
热议问题