测试泛型类型是否为字符串的最佳方法? (C#)

时间:2020-03-05 18:44:11  来源:igfitidea点击:

我有一个通用类,应允许任何类型,原始或者其他类型。唯一的问题是使用" default(T)"。当我们对值类型或者字符串调用default时,它将初始化为一个合理的值(例如空字符串)。当我们在一个对象上调用default(T)时,它返回null。由于各种原因,我们需要确保它不是原始类型,那么我们将拥有该类型的默认实例,而不是null。这是尝试1:

T createDefault()
{
    if(typeof(T).IsValueType)
    {
        return default(T);
    }
    else
    {
        return Activator.CreateInstance<T>();
    }
}

问题字符串不是值类型,但是它没有无参数的构造函数。因此,当前的解决方案是:

T createDefault()
{
    if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
    {
        return default(T);
    }
    else
    {
        return Activator.CreateInstance<T>();
    }
}

但这感觉就像是在跳动。有没有更好的方法来处理字符串大小写?

解决方案

回答

if (typeof(T).IsValueType || typeof(T) == typeof(String))
{
     return default(T);
}
else
{
     return Activator.CreateInstance<T>();
}

未经测试,但想到的第一件事。

回答

请记住,default(string)为null,而不是string.Empty。我们可能需要代码中的特殊情况:

if (typeof(T) == typeof(String)) return (T)(object)String.Empty;

回答

我们可以使用TypeCode枚举。在实现IConvertible接口的类上调用GetTypeCode方法,以获取该类实例的类型代码。 IConvertible由Boolean,SByte,Byte,Int16,UInt16,Int32,UInt32,Int64,UInt64,Single,Double,Decimal,DateTime,Char和String实现,因此我们可以使用此方法检查原始类型。有关"通用类型检查"的更多信息。