2017-08-24 10 views
1

デフォルトのコンストラクタのほかにコンストラクタをオーバーロードしようとしていますが、これは型intに対してのみ呼び出されます。私が得た最も近いものはthisです。タイプに基づいて汎用クラスのコンストラクタをオーバーロードする

できない場合はどうしてですか?

class Program 
{ 
    static void Main() 
    { 
     //default construcotr get called 
     var OGenerics_string = new Generics<string>(); 

     //how to make a different construcotr for type int 
     var OGenerics_int = new Generics<int>(); 
    } 

    class Generics<T> 
    { 
     public Generics() 
     { 
     } 
     // create a constructor which will get called only for int 
    } 
} 
+1

を行うことをやる、それがあまりにもコードのにおいのビットです。 – DavidG

答えて

7

これは、一般的なタイプに基づいて、コンストラクタ(または任意のメソッド)をオーバーロードすることはできません - しかし、あなたはファクトリメソッド作成することができます。その

class Generics<T> 
{ 
    public Generics() 
    { 
    } 

    public static Generics<int> CreateIntVersion() 
    { 
      /// create a Generics<int> here 
    } 
} 

ショートを、あなたが持っていると思いますリフレクションを使用して共有コンストラクタ内のジェネリック型をチェックし、コードを分岐させます。これはかなり醜いでしょう。

3

あなたが渡されたタイプを見つけると、そのintは場合することができます - あなたは本当にすることはできませんいくつかのロジック

void Main() 
{ 
    new Generics<string>(); 
    new Generics<int>(); 
} 

class Generics<T> 
{ 
    public Generics() 
    { 
     if(typeof(T) == typeof(int)) InitForInt(); 
    } 

    private void InitForInt() 
    { 
     Console.WriteLine("Int!");  
    } 
    // create a constructor which will get called only for int 
} 
関連する問題