J'utilise la réflexion pour parcourir Type
les propriétés de a et définir certains types par défaut. Maintenant, je pourrais faire un changement sur le type et définir default(Type)
explicitement, mais je préfère le faire sur une seule ligne. Existe-t-il un équivalent programmatique par défaut?
c#
reflection
default
tags2k
la source
la source
Réponses:
Dans la version plus récente de .net telle que .net standard,
type.IsValueType
doit être écrite commetype.GetTypeInfo().IsValueType
la source
default(T) != (T)(object)default(T) && !(default(T) != default(T))
vous avez un argument, sinon peu importe qu'il soit encadré ou non, car ils sont équivalents.default(T) != default(T)
retour faux, et c'est de la triche! =)Array.CreateInstance(type, length)
.Pourquoi ne pas appeler la méthode qui renvoie default (T) avec réflexion? Vous pouvez utiliser GetDefault de tout type avec:
la source
nameof(GetDefaultGeneric)
si vous le pouvez, au lieu de"GetDefaultGeneric"
Vous pouvez utiliser
PropertyInfo.SetValue(obj, null)
. S'il est appelé sur un type de valeur, il vous donnera la valeur par défaut. Ce comportement est documenté dans .NET 4.0 et .NET 4.5 .la source
Si vous utilisez .NET 4.0 ou supérieur et que vous souhaitez une version programmatique qui n'est pas une codification de règles définies en dehors du code , vous pouvez créer un
Expression
, le compiler et l'exécuter à la volée.La méthode d'extension suivante prendra un
Type
et obtiendra la valeur renvoyéedefault(T)
par le biais de laDefault
méthode sur laExpression
classe:Vous devez également mettre en cache la valeur ci-dessus en fonction de la
Type
, mais sachez que si vous appelez cela pour un grand nombre d'Type
instances et que vous ne l'utilisez pas constamment, la mémoire consommée par le cache peut l'emporter sur les avantages.la source
e.Compile()
. C'est tout l'intérêt des expressions.e.Compile()
devrait être mis en cache, mais en supposant que cette méthode soit environ 14 fois plus rapide, par exemplelong
. Voir gist.github.com/pvginkel/fed5c8512b9dfefc2870c6853bbfbf8b pour le benchmark et les résultats.e.Compile()
plutôt quee.Compile()()
? Par exemple, le type par défaut d'un type peut-il changer lors de l'exécution? Sinon (comme je pense que c'est le cas), vous pouvez simplement stocker en cache le résultat plutôt que l'expression compilée, ce qui devrait améliorer encore les performances.Pourquoi dites-vous que les génériques sont hors de propos?
la source
C'est la solution optimisée de Flem:
la source
return type.IsValueType ? typeDefaults.GetOrAdd(type, Activator.CreateInstance) : null;
La réponse choisie est une bonne réponse, mais soyez prudent avec l'objet retourné.
Extrapoler ...
la source
Les expressions peuvent aider ici:
Je n'ai pas testé cet extrait, mais je pense qu'il devrait produire des valeurs nulles "typées" pour les types de référence ..
la source
"typed" nulls
- Explique. Quel objet renvoyez-vous? Si vous renvoyez un objet de typetype
, mais que sa valeur estnull
, alors il ne - ne peut pas - avoir d'autre information que celle qu'il estnull
. Vous ne pouvez pas interroger unenull
valeur et découvrir de quel type il s'agit. Si vous ne retournez PAS null, mais revenez .. Je ne sais pas quoi .., alors cela ne fonctionnera pas commenull
.Je ne trouve rien de simple et d'élégant pour l'instant, mais j'ai une idée: si vous connaissez le type de propriété que vous souhaitez définir, vous pouvez écrire le vôtre
default(T)
. Il y a deux cas -T
est un type de valeur etT
est un type de référence. Vous pouvez le voir en cochantT.IsValueType
. S'ilT
s'agit d'un type de référence, vous pouvez simplement le définir surnull
. SiT
est un type de valeur, alors il aura un constructeur sans paramètre par défaut que vous pouvez appeler pour obtenir une valeur "vide".la source
Je fais la même tâche comme ça.
la source
Équivalent à la réponse de Dror mais comme méthode d'extension:
la source
Légers ajustements à la solution @Rob Fonseca-Ensor : La méthode d'extension suivante fonctionne également sur .Net Standard puisque j'utilise GetRuntimeMethod au lieu de GetMethod.
... et le test unitaire correspondant pour ceux qui se soucient de la qualité:
la source
la source
Nullable<T>
types: il ne retourne pas l'équivalentdefault(Nullable<T>)
qui devrait l'êtrenull
. La réponse acceptée par Dror fonctionne mieux.Cela devrait fonctionner:
Nullable<T> a = new Nullable<T>().GetValueOrDefault();
la source