web-dev-qa-db-fra.com

moyen générique de vérifier null ou vide pour tout type tel que int, string, double

J'essaie de faire en sorte que cela fonctionne mais, d'une manière ou d'une autre, ça me sort de la main ... Je veux pouvoir vérifier null ou vide avec le type que j'ai assigné 

EX: 

int i =0;
string mystring = "";

var reult  = CheckNullOrEmpty(10) // passing int
var result 1  = CheckNullOrEmpty(mystring) // passing string 

 public bool CheckNullOrEmpty<T>(T value)
 {
    // check for null or empty for strings
    // check for null i.e. 0 for int 

 }

est-ce que quelqu'un peut m'aider avec ceci? J'essaie de comprendre comment les génériques fonctionnent pour cette méthode simple.

12
patel.milanb
public static bool CheckNullOrEmpty<T>(T value)
{
     if (typeof(T) == typeof(string))
        return string.IsNullOrEmpty(value as string);

     return value == null || value.Equals(default(T));
}

Comment utiliser:

class Stub { }

bool f1 = CheckNullOrEmpty(""); //true
bool f2 = CheckNullOrEmpty<string>(null); //true
bool f3 = CheckNullOrEmpty(0); //true
bool f4 = CheckNullOrEmpty<Stub>(null);  //true
25
cuongle

Vous pouvez vérifier contre default(T);

 public bool CheckNullOrEmpty<T>(T value)
 {
      return value == default(T);
 }

Pour plus d'informations: http://msdn.Microsoft.com/en-us/library/xwth0h0d.aspx

2
nein.

Vous pouvez utiliser default () -

par exemple.:

if(value != default(T))

de MSDN:

Étant donné une variable t d'un type paramétré T, l'instruction t = null N'est valide que si T est un type de référence et que t = 0 ne fonctionnera que pour les types de valeur numérique , Mais pas pour les structures. La solution consiste à utiliser le mot clé par défaut , Qui renvoie null pour les types de référence et zéro pour les types de valeur numérique. Pour les structures, il retournera chaque membre de La structure initialisée à zéro ou à zéro, selon qu'il s'agisse de types de valeur ou de référence .

http://msdn.Microsoft.com/en-us/library/xwth0h0d(v=vs.80).aspx

1
Dave Bish

Étant donné que votre implémentation CheckNullOrEmpty diffère selon le type, vous ne pouvez pas utiliser cette vérification en tant que fonction générique.

Si vous utilisez toutefois des types de valeur Nullable, vous pouvez utiliser GetValueOrDefault() :

int? i = 0;

var result = i.GetValueOrDefault(10);

Ensuite, pour string, utilisez simplement une méthode d'extension:

public static string GetValueOrDefault(this string item, string defaultValue = "")
{
    return !string.IsNullOrWhiteSpace(item) ? item : defaultValue;
}

Ensuite, vous pouvez faire:

string i = null;
string mystring = "";

var result  = i.GetValueOrDefault(mystring);
1
mattytommo
 J'ai ajouté quelques modifications de factorisation: 
 
 1. DBNull n'est pas perçu comme une absurdité, alors ajoutez la (valeur sous forme de chaîne) 
 une ligne datatable [colonne] créée dynamiquement au moment de l'exécution (comme: row ["PropertyName"]) ne le verra pas comme une chaîne avec typeof (T), car le type de colonne de base est object. Donc ajouté une vérification supplémentaire pour typeof (objet) et si non null tester que la ToString () est une valeur vide. Je n’ai pas testé cela à fond, alors il se peut que cela ne fonctionne pas pour tous les types de colonnes de données. 
  public static bool CheckNullOrEmpty<T>(T value)
  {
        // note: this does not see DBNull as isnullorempty.  
        if (typeof(T) == typeof(string))
        {
            if (!string.IsNullOrEmpty(value as string))
            {
                return string.IsNullOrEmpty(value.ToString().Trim());
            }
            else
            {
                return true;
            }
        }
        else if (typeof(T) == typeof(object))
        {
            // note: datatable columns are always seen as object at runtime with generic T regardless of how they are dynamically typed?
            if (value != null) {
                return string.IsNullOrEmpty(value.ToString().Trim());
            }
        }


      return value == null || value.Equals(default(T));
  }
0
rjean99