Когда 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);
}