Prenons l'exemple du cours suivant:
class Sometype
{
int someValue;
public Sometype(int someValue)
{
this.someValue = someValue;
}
}
Je souhaite ensuite créer une instance de ce type en utilisant la réflexion:
Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);
Normalement, cela fonctionnera, mais comme SomeType
n'a pas défini de constructeur sans paramètre, l'appel à Activator.CreateInstance
lèvera une exception de type MissingMethodException
avec le message " Aucun constructeur sans paramètre défini pour cet objet. " Existe-t-il un autre moyen de créer une instance de ce type? Ce serait un peu nul d'ajouter des constructeurs sans paramètre à toutes mes classes.
FormatterServices.GetUninitializedObject
ne permet pas de créer une chaîne non initialisée. Vous pouvez obtenir une exception:System.ArgumentException: Uninitialized Strings cannot be created.
veuillez garder cela à l'esprit.Réponses:
J'ai initialement publié cette réponse ici , mais voici une réimpression car ce n'est pas exactement la même question mais a la même réponse:
FormatterServices.GetUninitializedObject()
créera une instance sans appeler de constructeur. J'ai trouvé cette classe en utilisant Reflector et en explorant certaines des classes de sérialisation .Net.Je l'ai testé à l'aide de l'exemple de code ci-dessous et il semble que cela fonctionne très bien:
la source
Utilisez cette surcharge de la méthode CreateInstance:
Voir: http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx
la source
Lorsque j'en ai évalué les performances,
(T)FormatterServices.GetUninitializedObject(typeof(T))
c'était plus lent. En même temps, les expressions compilées vous apporteraient de grandes améliorations de vitesse bien qu'elles ne fonctionnent que pour les types avec le constructeur par défaut. J'ai adopté une approche hybride:Cela signifie que l'expression de création est effectivement mise en cache et n'encourt des pénalités que la première fois que le type est chargé. Traitera également les types de valeur de manière efficace.
Appeler:
Notez que
(T)FormatterServices.GetUninitializedObject(t)
cela échouera pour la chaîne. Par conséquent, une gestion spéciale de la chaîne est en place pour renvoyer une chaîne vide.la source
Bonnes réponses mais inutilisables sur le framework compact dot net. Voici une solution qui fonctionnera sur CF.Net ...
la source