我想要一个通用方法,它返回传递类型的默认值,但对于集合类型,我想获得空集合而不是 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);
}
如何完成它?
编辑: 如果有人想获得某种类型的默认值,基于类型实例而不是类型标识符,可以使用下面的这种构造,即:
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);
}
}