我有一个通用的级,应该允许任何类型的、原始的或以其他方式。唯一的问题是使用 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>();
}

未经测试,但第一件事,来铭记。

你可以使用 代码 枚举。叫GetTypeCode方法上班,实施的请参接口获得的类型代码,用于一个实例。请参是通过实施布尔、符号字节,字节,Int16,UInt16,Int32,UInt32,Int64,UInt64,单,双人间,小、DateTime,Char,并String,所以你可以检查的基本类型使用这个。更多的信息,"一般类型的检查".

就个人而言,我喜欢的方法载:

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>();
            } 
        } 

    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top