Hoe de klassenaam als parameter in C# te gebruiken

wat ik wil doen is automatisch een object maken.

In Java kan klasse worden doorgegeven als parameter, bijvoorbeeld

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

het is een voordeel voor veel dingen.

dus, hoe kan ik iets soortgelijks doen in C#????


Antwoord 1, autoriteit 100%

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

Gebruik:

createObjectBy(typeof(A));

Of je kunt Activator.CreateInstancegewoon rechtstreeks gebruiken 🙂


Antwoord 2, autoriteit 71%

De ideale manier zou zijn om generieke geneesmiddelen te gebruiken

Type is bekend ten tijde van ontwerp

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

Een voorbeeld van een oproep ziet er als volgt uit

var employee = CreateInstance<Employee>();

Type is onbekend tijdens runtime

Als het type object tijdens runtime onbekend is, bijvoorbeeld via een plug-insysteem, moet u de klasse Typegebruiken:

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

Een voorbeeld van een oproep ziet er als volgt uit

var instance = CreateInstance(someType);

Prestaties

Natuurlijk gaat er niets boven het instantiëren van een object dan door het trefwoord newte gebruiken. Behalve misschien niet instantiëren, maar in plaats daarvan een object hergebruiken, zoals door middel van caching.

Als je genoegen moet nemen met de tweede methode waarvan het type onbekend is, zijn er enkele alternatievenvoor Activator.CreateInstance. Hoewel het artikel aanbeveelt om lambda-expressie te gebruiken, is je grootste overweging:

  • Moet uw onbekende object vaak in korte tijd worden geïnstantieerd, of maakt u het maar één keer

Als je je object maar één keer hoeft te maken, blijf dan gewoon bij de Activator.CreateInstance-methode. Als je het meerdere keren in korte tijd moet maken, probeer dan de lambda-aanpak. Die laatste benadering is vergelijkbaar met een gecompileerde reguliere expressie versus een directe reguliere expressie.


Antwoord 3, autoriteit 10%

C# ondersteunt dit niet. Maar wat probeer je te doen?

Je zou waarschijnlijk het volgende kunnen gebruiken:

createObjectBy(Type type);

of

createObjectBy<T>();

Antwoord 4, autoriteit 10%

Gebruik de klasse Type. U kunt er een exemplaar van terugbellen

obj.GetType();

of zonder een objectinstantie

typeof(className);

Ik hoop dat het helpt.

Other episodes