题
我有一个通用的级,应该允许任何类型的、原始的或以其他方式。唯一的问题是使用 default(T)
.当你呼叫默认值类型或一串,初始化它以合理的价值(例如empty string).当你打电话 default(T)
在一个目的,它返回空。由于各种原因我们需要确保,如果它不是一个基本类型,然后我们将有一个默认的实例类型, 不 空。这里是试图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>();
}
}
但这种感觉就像一个暂且。是有一个更好的方式来处理串的情况下?
解决方案
请记住,默认(string)is null,不串。空。你可能会想要一个特殊的情况下,在你的代码:
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>();
}
未经测试,但第一件事,来铭记。
就个人而言,我喜欢的方法载:
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();
}
}
讨论串不是在这里工作。
我必须有下列代码泛使它工作
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>();
}
}
}
不隶属于 StackOverflow