gpt4 book ai didi

c# - default(T) 使用空集合而不是 null

转载 作者:可可西里 更新时间:2023-11-01 07:54:29 27 4
gpt4 key购买 nike

我想要一个通用方法,它为传递的类型返回默认值,但是对于集合类型,我想要得到空集合而不是 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);
}
}

最佳答案

您可以使用静态构造函数的魔力来高效地执行此操作。要在代码中使用默认值,只需使用 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15705895/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com