質問

していま汎用クラスに入れるべき他の型のプリミティブになります。唯一の問題はこの使用 default(T).を呼び出すときはデフォルト値タイプや文字列の初期化を行いますので合理的な価値などは空文字列).をご利用いただきます default(T) オブジェクトではnullを返します。さまざまな理由でいることを確実にしなければならないプリミティブ型、そしてデフォルトのインスタンスの型 ない nullになります。こちらではの試み1:

T createDefault()
{
    if(typeof(T).IsValueType)
    {
        return default(T);
    }
    else
    {
        return Activator.CreateInstance<T>();
    }
}

問題文字列はペイントされませんが値型をお使いのお客様は、それぞれてparameterlessコンストラクタです。では、現在の解:

T createDefault()
{
    if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
    {
        return default(T);
    }
    else
    {
        return Activator.CreateInstance<T>();
    }
}

このようkludge.あるもキレイに処理する方法を文字列です。

役に立ちましたか?

解決

このデフォルト(string)の値が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>();
}

未審査で最初のものといただくこともできます。

で利用できます TypeCode ザ一覧の取得を行います。のGetTypeCode方法を実装するクラスのIConvertibleを取得するインタフェースの型コードインスタンスのクラスです。IConvertibleにより実現されたBoolean,SByte、Byte、Int16,UInt16,Int32,UInt32,Int64,UInt64、シングル、ダブル、小数点、DateTime、Charの文字列で確認することができますプリミティブ型を用います。詳細情報に"汎用的な型チェック".

個人的には好きの方法の過負荷:

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