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.CreateInstance
gewoon 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 Type
gebruiken:
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 new
te 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.