测试泛型类型是否为字符串的最佳方法? (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实现,因此我们可以使用此方法检查原始类型。有关"通用类型检查"的更多信息。