Когда new-able использует новый T(), в противном случае используйте значение по умолчанию (T)
Я работаю над общей функцией С#. Когда ошибка, если общий тип может быть доступен для нового, верните new T()
, в противном случае верните default(T)
.
Код выглядит следующим образом:
private T Func<T>()
{
try
{
// try to do something...
}
catch (Exception exception)
{
if (T is new-able) // <---------- How to do this?
{
return new T();
}
else
{
return default(T);
}
}
}
Я знаю, что для <использования > new T()
требуется where T : new()
. Этот вопрос заключается в том, как судить об этом во время выполнения?
Ответы
Ответ 1
Вам просто нужно проверить, имеет ли тип конструктор без параметров. Вы делаете это, вызывая метод Type.GetConstructor
с пустыми типами как параметр.
var constructorInfo = typeof(T).GetConstructor(Type.EmptyTypes);
if(constructorInfo != null)
{
//here you go
object instance = constructorInfo.Invoke(null);
}
Ответ 2
Если я правильно помню, Activator.CreateInstance<T>
вернет объект, построенный с помощью конструктора без параметров, если T
является классом или default(T)
, если T
является структурой.
Вы можете использовать технику в Sriram, чтобы сначала убедиться, что для T
существует конструктор без параметров.
Ответ 3
Вы можете что-то вроде проверки конструктора по умолчанию и выполнения нового T(), если он найден.
Для этого вы можете использовать что-то вроде:
var constructor = typeof(T).GetConstructor(Type.EmptyTypes);
if(constructor != null)
{
return (T)constructor.Invoke(null);
}
else
{
return default(T);
}