Si j'ai un paramètre de type générique qui est un type de valeur et que je veux savoir si une valeur est égale à la valeur par défaut, je le teste comme ceci:
static bool IsDefault(object value){ if(!(value is ValueType)){ throw new ArgumentException("Precondition failed: Must be a ValueType", "value"); } var @default = Activator.CreateInstance(value.GetType()); return value.Equals(@default); }
4 Réponses :
Je voudrais demander valueltype code> comme paramètre à simplifier:
Le commentaire de Cdhowie m'a repensé cette solution, car il ne gère pas le potentiel NullReferenceException code>. Assurez-vous de gérer ce cas ou lancez un
argumentnulxception code> si le paramètre est null.
sur une note latérale, y a-t-il quelque chose que je ne considère pas ici avec respect d'évaluer des structures nullables? p> blockQuote>
Oui, vous manquez quelque chose. En prenant un objet
code> car le paramètre dans vous nécessite un code d'appel à la case
NULLABLABLE
code> (qui les convertit sur NULL ou à leur t code > Valeur). Donc, si vous passez une nullable, votre
est / lancer code> va lancer car
null code> ne sera jamais de type de valeur. P>
EDIT: STRUT> Comme @CDHOWIE dit, vous devrez vérifier NULL. Cela fonctionnera également pour des types nullables. P>
Une autre chose à considérer avec des structures nullables est qu'il n'ya aucun moyen de faire la distinction entre par exemple. un int code> avec valeur zéro et un
int? code> avec valeur zéro, même si zéro est la valeur par défaut du premier de ces types, mais n'est pas la valeur par défaut pour la seconde .
J'ai trouvé utile les méthodes d'extension suivantes et fonctionnera pour tous les types:
public static object GetDefault(this Type t) { return t.IsValueType ? Activator.CreateInstance(t) : null; } public static T GetDefault<T>() { var t = typeof(T); return (T) GetDefault(t); } public static bool IsDefault<T>(T other) { T defaultValue = GetDefault<T>(); if (other == null) return defaultValue == null; return other.Equals(defaultValue); }
Cela ne semble pas fonctionner dans un scénario de réflexion pur où vous ne connaissez pas le type de l'un ni l'autre, celui qui arrive est un objet. Donc, le t code> in
isdefault code> est juste objet, et
.equals code> vérifie juste pour l'égalité de référence. Au moins dans mon cas boxé
0 code> n'était pas égal à
activator.createinstance (propriété.propertytype) code> où
ithathtype code> est
int code >
J'ai essayé votre solution et j'ai trouvé encore plus court (je crois que cela devrait bien fonctionner aussi): Objet statique public getDefault
Une ancienne question mais la réponse acceptée ne fonctionne pas pour moi, donc je soumets cela (peut probablement être amélioré):
typeof(int).GetDefault(); // returns 0 typeof(int?).GetDefault(); // returns 0 typeof(DateTime).GetDefault(); // returns 01/01/0001 00:00:00 typeof(DateTime?).GetDefault(); // returns 01/01/0001 00:00:00 typeof(string).GetDefault(); // returns null typeof(Exception).GetDefault(); // returns null
Fyi, c'est la réponse. B>
Regarde bien pour moi. Bonne chose que la valeur
est valueType code> Test vérifiera également
null code>. :)
Deux questions: 1. Pourquoi ne pas utiliser la méthode générique? 2. Pourquoi ne pas faire le paramètre à la deuxième méthode a
valeur de valeur code> car vous allez simplement vous plaindre de toute façon?
Ou faire
si (! (Valeur est valuelette)) Valeur de retour == null; code>