代码之家  ›  专栏  ›  技术社区  ›  Rex M

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

  •  81
  • Rex M  · 技术社区  · 18 年前

    我有一个泛型类,它应该允许任何类型,原语或其他类型。唯一的问题是使用 default(T) . 当您对值类型或字符串调用default时,它会将其初始化为合理的值(例如空字符串)。当你打电话的时候 在对象上,它返回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>();
        }
    }
    

    但这感觉像是一场混乱。有更好的方法处理字符串大小写吗?

    5 回复  |  直到 9 年前
        1
  •  173
  •   Matt Hamilton    14 年前

    请记住,默认值(string)是null,而不是string.Empty。您可能需要代码中的特殊情况:

    if (typeof(T) == typeof(String)) return (T)(object)String.Empty;
    
        2
  •  14
  •   Rex M    16 年前
    if (typeof(T).IsValueType || typeof(T) == typeof(String))
    {
         return default(T);
    }
    else
    {
         return Activator.CreateInstance<T>();
    }
    

    未经测试,但首先想到的是。

        3
  •  4
  •   Community Mohan Dere    9 年前
        4
  •  2
  •   theoski    11 年前

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

    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();
      }
    }
    
        5
  •  -1
  •   Armitxes    6 年前

    我知道这个问题很老,但有一个更新。

    is 运算符来比较类型。您不再需要使用 typeof 正如公认的答案一样。

            public bool IsObjectString(object obj)
            {
                return obj is string;
            }
    

    https://docs.microsoft.com/en-US/dotnet/csharp/language-reference/keywords/is

        6
  •  -6
  •   Anil    15 年前

    我必须为泛型编写以下代码才能使其工作-

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