Cómo usar el nombre de clase como parámetro en C #

lo que quiero hacer es crear automáticamente algún objeto.

En Java, la clase se puede pasar como parámetro, por ejemplo

Class A{ } Object createObjectBy(class clazz){ // .. do construction work here } when using it, just ---> createObjectBy(A.class) 

es un beneficio para muchas cosas.

entonces, ¿cómo puedo hacer algo similar en C # ????

 Object createObjectBy(Type clazz){ // .. do construction work here Object theObject = Activator.CreateInstance(clazz); return theObject; } 

Uso:

 createObjectBy(typeof(A)); 

O simplemente podría usar Activator.CreateInstance directamente 🙂

La forma ideal sería usar generics

Tipo es conocido en el momento del diseño

 public static T CreateInstance() where T: new() { // Do some business logic Logger.LogObjectCreation(typeof(T)); // Actualy instanciate the object return new T(); } 

Un ejemplo de llamada se vería como

 var employee = CreateInstance(); 

Tipo desconocido en tiempo de ejecución

Si el tipo de objeto es desconocido en tiempo de ejecución, por ejemplo a través de un sistema de complemento, debe usar la clase Type :

 public static object CreateInstance(Type type) { // Do some business logic Logger.LogObjectCreation(type); // Actualy instanciate the object return Activator.CreateInstance(type); } 

Un ejemplo de llamada se vería como

 var instance = CreateInstance(someType); 

Actuación

Por supuesto, no hay nada mejor que instanciar un objeto que usar la palabra clave new . Excepto quizás no instanciar, sino reutilizar un objeto, como a través del almacenamiento en caché.

Si tiene que conformarse con el segundo método donde se desconoce el tipo, existen algunas alternativas a Activator.CreateInstance . Aunque el artículo recomienda usar expresiones lambda, tu mayor consideración es:

  • ¿Su objeto desconocido necesita ser instanciado a menudo en un corto período de tiempo, o solo lo crea una vez?

Si solo necesita crear su objeto una vez, simplemente siga el método Activator.CreateInstance. Si necesita crearlo varias veces en poco tiempo, pruebe el enfoque lambda. Ese último enfoque es similar a una expresión regular comstackda frente a una expresión regular sobre la marcha.

Use la clase Tipo. Puede devolver una instancia por llamada

 obj.GetType(); 

o sin una instancia de objeto

 typeof(className); 

Espero que ayude.

C # no es compatible con esto. ¿Pero qué estás tratando de hacer?

Probablemente podrías usar:

 createObjectBy(Type type); 

o

 createObjectBy();