Как получить значение по умолчанию для типа, если тип известен только как System.Type?
Если мне нужен метод, который возвращает значение по умолчанию для данного типа, и метод является общим, я могу вернуть значение по умолчанию, например:
public static T GetDefaultValue()
{
return default(T);
}
Можно ли сделать что-то подобное, если у меня есть тип только как объект System.Type
?
public static object GetDefaultValue(Type type)
{
//???
}
Ответы
Ответ 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[] {} );
}
Я попробовал это в консольном приложении, и он возвращает экземпляр класса по умолчанию, считая его классом. Если вам нужно, чтобы он работал и для ссылочных типов, вам понадобится дополнительная техника.