общий способ проверки нулевого или пустого для любого типа типа int, string, double

Я пытаюсь получить эту работу, но каким-то образом она выходит из моей руки... Я хочу иметь возможность проверять значение null или пустое на любой тип, который я назначил.

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 

 }

может кто-то помочь мне с этим.. Я пытаюсь понять, как дженерики работают для этого простого метода.

Ответ 1

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));
}

Как использовать:

class Stub { }

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

Ответ 2

Вы можете проверить default(T);

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

Для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx

Ответ 3

Вы можете использовать default() -

например:

if(value != default(T))

из MSDN:

Учитывая переменную t параметризованного типа T, оператор t = null действителен только в том случае, если T является ссылочным типом, а t = 0 будет работать только для числовых типов значений, но не для структур. Решение состоит в том, чтобы использовать ключевое слово по умолчанию, которое будет возвращать значение null для ссылочных типов и ноль для числовых типов значений. Для structs он возвращает каждый член структуры, инициализированный до нуля или null, в зависимости от того, являются ли они значениями или ссылочными типами.

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

Ответ 4

Поскольку ваша реализация CheckNullOrEmpty отличается по типу, вы не можете иметь эту проверку в качестве общей функции.

Однако, если вы используете типы значений Nullable, вы можете использовать GetValueOrDefault():

int? i = 0;

var result = i.GetValueOrDefault(10);

Затем для string просто используйте метод расширения:

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

Тогда вы можете сделать:

string i = null;
string mystring = "";

var result  = i.GetValueOrDefault(mystring);

Ответ 5

I've added a couple of re-factorings:

 1. DBNull is not seen as isnullorempty so added the (value as string)
 2. Passing a datatable row[column] that was created dynamically at runtime (like: row["PropertyName"]) will not see this as a string with typeof(T) due to the fact that the column type base is object. So added an extra check for typeof(object) and if not null test that the ToString() is empty value. I haven't tested this fully so may not work for all types of data columns.
  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));
  }