testinggenericstypes是string的最佳方法是什么? (C#)
我有一个generics类应该允许任何types,原语或其他。 唯一的问题是使用default(T)
。 在值types或string上调用默认值时,会将其初始化为合理值(如空string)。 在对象上调用default(T)
时,它将返回null。 由于各种原因,我们需要确保如果它不是原始types,那么我们将有一个types的默认实例, 而不是 null。 这里是尝试1:
T createDefault() { if(typeof(T).IsValueType) { return default(T); } else { return Activator.CreateInstance<T>(); } }
问题 – string不是一个值types,但它没有无参数的构造函数。 所以,目前的解决scheme是:
T createDefault() { if(typeof(T).IsValueType || typeof(T).FullName == "System.String") { return default(T); } else { return Activator.CreateInstance<T>(); } }
但是这感觉就像一个kludge。 有一个更好的方式来处理string的情况下?
请记住,默认(string)为空,而不是string.Empty。 您可能需要在代码中使用特殊情况:
if (typeof(T) == typeof(String)) return (T)(object)String.Empty;
if (typeof(T).IsValueType || typeof(T) == typeof(String)) { return default(T); } else { return Activator.CreateInstance<T>(); }
未经testing,但首先想到的。
您可以使用TypeCode枚举。 对实现IConvertible接口的类调用GetTypeCode方法,以获取该类实例的types代码。 IConvertible是通过布尔,SByte,Byte,Int16,UInt16,Int32,UInt32,Int64,UInt64,Single,Double,Decimal,DateTime,Char和String来实现的,所以你可以用这个来检查原始types。 有关“ 通用types检查 ”的更多信息。
我个人喜欢方法重载:
public static class Extensions { public static String Blank(this String me) { return String.Empty; } public static T Blank<T>(this T me) { var tot = typeof(T); return tot.IsValueType ? default(T) : (T)Activator.CreateInstance(tot) ; } } class Program { static void Main(string[] args) { Object o = null; String s = null; int i = 6; Console.WriteLine(o.Blank()); //"System.Object" Console.WriteLine(s.Blank()); //"" Console.WriteLine(i.Blank()); //"0" Console.ReadKey(); } }
String的讨论在这里不起作用。
我必须有以下代码才能使其工作 –
private T createDefault() { { if(typeof(T).IsValueType) { return default(T); } else if (typeof(T).Name == "String") { return (T)Convert.ChangeType(String.Empty,typeof(T)); } else { return Activator.CreateInstance<T>(); } } }