J'ai un très grand objet avec de nombreuses variables de type nullable. J'ai également un dictionnaire que je veux remplir avec les variables non nulles de cet objet.
Le code ressemblera à ceci
if (myObject.whatever != null)
{
myDictionary.Add("...",myObject.whatever);
}
if (myObject.somethingElse != null)
{
myDictionary.Add("...",myObject.somethingElse);
...
EDIT (Désolé d'avoir foiré le code)
Lorsque nous répétons cela pour la énième fois, nous obtenons un désordre de code très long. Existe-t-il un moyen plus court d'écrire ce gâchis? Je connais l'opérateur conditionnel (aka?) Mais c'est juste pour les affectations. Y a-t-il quelque chose comme ça pour ajouter à une collection?
Que diriez-vous d'une méthode d'extension pour votre dictionnaire?
public static void AddIfNotNull<T,U>(this Dictionary<T,U> dic, T key, U value)
where U : class {
if (value != null) { dic.Add(key, value); }
}
Vous pouvez alors faire ceci:
myDictionary.AddIfNotNull("...",myObject.whatever);
Je recommanderais d'écrire une méthode d'extension:
public static class MyExtensions
{
public static void AddIfNotNull<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
{
if ((object)value != null)
dictionary.Add(key, value);
}
}
L'utilisation de (object)value != null
Garantit que cela fonctionne comme prévu avec les types nullables, (par exemple int?
) Les types de valeur, (par exemple int
) et les types de référence (par exemple SomeClass
). Si vous le comparez à default(TValue)
, un int
de 0
Ne sera pas ajouté, même s'il n'est pas nul. Si vous incluez une exigence TValue : class
, Vous ne pouvez pas utiliser Nullable<T>
Comme type, ce qui semble être votre utilisation la plus courante.
Vous pouvez créer une méthode qui cache votre if
:
AddIfNotNull(myDictionary, "...", myObject.whatever);
private static void AddIfNotNull<K,T>(
IDictionary<K,T> myDictionary
, K key
, T value) {
if (value != default(T)) {
myDictionary.Add(key, value);
}
}
Vous pouvez gagner des "points pour le style" en faisant de la méthode une extension (vous devez alors l'ajouter à une classe statique):
private static void AddIfNotNull<K,T>(
this IDictionary<K,T> myDictionary
, K key
, T value) {
if (value != default(T)) {
myDictionary.Add(key, value);
}
}
myDictionary.AddIfNotNull(myDictionary, "...", myObject.whatever);
Si vous savez que vous n'insérez que des objets de type référence, remplacez default(T)
par null
et ajoutez une contrainte class T
Au générique.
Si ce n'est pas un problème de performances: pourquoi ne pas tout ajouter puis supprimer ce dont vous n'avez pas besoin?
public void addToDict(string ?myObj, Dictionary<,> myDict) {
if (myObj != null)
myDict.Add("...", myObj);
}
addToDict(myObject.whatever, myDict);
addToDict(myObject.somethignElse, myDict);
etc