Подтвердить что ты не робот

Как получить значение по умолчанию для типа, если тип известен только как System.Type?

Если мне нужен метод, который возвращает значение по умолчанию для данного типа, и метод является общим, я могу вернуть значение по умолчанию, например:

public static T GetDefaultValue()
{
  return default(T);
}

Можно ли сделать что-то подобное, если у меня есть тип только как объект System.Type?

public static object GetDefaultValue(Type type)
{
  //???
}
4b9b3361

Ответ 1

Поскольку вам действительно нужно только беспокоиться о типах значений (ссылочные типы будут просто нулевыми), вы можете использовать Activator.CreateInstance для вызова конструктора по умолчанию на них.

public static object GetDefaultValue(Type type) {
   return type.IsValueType ? Activator.CreateInstance(type) : null;
}

Изменить: Джон (конечно) правильный. IsClass недостаточно исчерпывающий - он возвращает False, если type является интерфейсом.

Ответ 2

Вот как я обычно это делаю. Это позволяет избежать всего IsValueType или вообще искать проблемы с конструкторами.

public static object MakeDefault(this Type type)
{
    var makeDefault = typeof(ExtReflection).GetMethod("MakeDefaultGeneric");
    var typed = makeDefault.MakeGenericMethod(type);
    return typed.Invoke(null, new object[] { });
}

public static T MakeDefaultGeneric<T>()
{
    return default(T);
}

Ответ 3

Без общего типа вы не можете гарантировать, что тип имеет конструктор без параметров, но вы можете искать его с помощью отражения:

public static object GetDefaultValue(Type type)
{
    ConstructorInfo ci = type.GetConstructor( new Type[] {} );
    return ci.Invoke( new object[] {} );
}

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