Я хотел бы иметь общий метод, который возвращает значение по умолчанию для пройденного типа, но для типа коллекции я хотел бы получить пустую коллекцию вместо null, например:
GetDefault<int[]>(); // returns empty array of int's
GetDefault<int>(); // returns 0
GetDefault<object>(); // returns null
GetDefault<IList<object>>(); // returns empty list of objects
Метод, который я начал писать, следующий:
public static T GetDefault<T>()
{
var type = typeof(T);
if(type.GetInterface("IEnumerable") != null))
{
//return empty collection
}
return default(T);
}
Как это сделать?
EDIT: Если кто-то захочет получить значение по умолчанию какого-либо типа, основанное на экземпляре типа вместо идентификатора типа, эту конструкцию ниже можно использовать, то есть:
typeof(int[]).GetDefault();
Реализация внутренне основана на ответе @280Z28:
public static class TypeExtensions
{
public static object GetDefault(this Type t)
{
var type = typeof(Default<>).MakeGenericType(t);
var property = type.GetProperty("Value", BindingFlags.Static | BindingFlags.Public);
var getaccessor = property.GetGetMethod();
return getaccessor.Invoke(null, null);
}
}