Проверка нулей на универсальные типы
Я хотел создать функцию, которая будет проверять значение параметра, если он равен нулю, он должен устанавливать значение в зависимости от типа параметра, иначе он должен просто возвращать значение как есть.
Вот что я попробовал.
public static T ConvertNull<T>(T obj)
{
if (String.IsNullOrEmpty(obj.ToString()))
{
HttpContext.Current.Response.Write("COMING IN");
if (typeof(T) == typeof(Int32))
{
return (T)Convert.ChangeType(0, typeof(T));
}
else if (typeof(T) == typeof(DateTime))
{
return (T)Convert.ChangeType(DateTime.Now, typeof(T));
}
else
{
return (T)Convert.ChangeType(String.Empty, typeof(T));
}
}
else
{
HttpContext.Current.Response.Write("ELSE");
return obj;
}
}
Но проблема в том, что он всегда входит в раздел ELSE и возвращает значение Junk.
Может кто-нибудь сказать мне, что не так с вышеуказанной функцией.
2 ответа
Если у вас есть обнуляемый тип, который вы хотите заменить на какое-либо значение в случае, если оно равно нулю, и вернуть существующее значение в том случае, если оно не равно нулю, существует уже существующий оператор, который делает это, ??
оператор:
int? i = null; //note of course that a non-nullable int cannot be null
int n = i ?? 0; //equals zero
string s = null;
string s2 = s ?? ""; //equals an empty string
string s3 = "hi";
string s4 = s3 ?? ""; //equals "hi"
Удобно ??
Оператор даже не скомпилируется в случае, если тип первого операнда не обнуляется.
String.IsNullOrEmpty(obj.ToString())
очень редко будет true
, Единственное, о чем я могу думать, это сгенерирует пустую строку. Vi ToString() - это еще одна пустая строка. На самом деле, если ToString()
был переопределен (как это было для нативных типов, таких как DateTime
а также int
, вы получите полное имя объекта.
может ты хочешь
if (obj == default(T))
?