У меня есть общий класс, который должен допускать любой тип, примитив или иное. Единственная проблема с этим - использование default(T)
. Когда вы вызываете default по типу значения или строке, он инициализирует его до разумного значения (например, пустую строку). Когда вы вызываете default(T)
на объект, он возвращает null. По разным причинам нам нужно убедиться, что если это не примитивный тип, то у нас будет экземпляр по умолчанию типа, не null. Вот попытка 1:Лучший способ проверить, является ли общий тип строкой? (C#)
T createDefault()
{
if(typeof(T).IsValueType)
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
Проблема - строка не тип значения, но она не имеет конструктора без параметров. Таким образом, текущее решение:
T createDefault()
{
if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
Но это похоже на клочья. Есть ли лучший способ справиться с строкой?
Я думал, что я пытался это решение раньше, и это не сработало, но я, должно быть, сделал что-то глупое. И спасибо, что указали, что default (string) возвращает null, из-за этого мы еще не запутались в ошибке, но это правда. – 2010-05-29 00:32:26
@Matt Hamilton: +1, но вы должны обновить свой ответ, чтобы вернуть '(T) (объект) String.Empty', как это было предложено CodeInChaos, потому что тип возвращаемого метода является общим, вы не можете просто вернуть строку. – VoodooChild 2012-01-23 17:04:09