GetDefault<int[]>(); // returns empty array of int'sGetDefault<int>(); // returns 0GetDefault<object>(); // returns nullGetDefault<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); }}解决方法 您可以使用静态构造函数的魔术来高效地执行此 *** 作.要使用代码中的默认值,只需使用Default< T> .Value.在应用期间,该值仅对任何给定类型T一次进行评估.
public static class Default<T>{ private static Readonly T _value; static Default() { if (typeof(T).IsArray) { if (typeof(T).GetArrayRank() > 1) _value = (T)(object)Array.CreateInstance(typeof(T).GetElementType(),new int[typeof(T).GetArrayRank()]); else _value = (T)(object)Array.CreateInstance(typeof(T).GetElementType(),0); return; } if (typeof(T) == typeof(string)) { // string is IEnumerable<char>,but don't want to treat it like a collection _value = default(T); return; } if (typeof(IEnumerable).IsAssignableFrom(typeof(T))) { // check if an empty array is an instance of T if (typeof(T).IsAssignableFrom(typeof(object[]))) { _value = (T)(object)new object[0]; return; } if (typeof(T).IsGenericType && typeof(T).GetGenericArguments().Length == 1) { Type elementType = typeof(T).GetGenericArguments()[0]; if (typeof(T).IsAssignableFrom(elementType.MakeArrayType())) { _value = (T)(object)Array.CreateInstance(elementType,0); return; } } throw new NotImplementedException("No default value is implemented for type " + typeof(T).Fullname); } _value = default(T); } public static T Value { get { return _value; } }}总结
以上是内存溢出为你收集整理的c# – default(T)与空集合而不是null全部内容,希望文章能够帮你解决c# – default(T)与空集合而不是null所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)