2012-03-03 6 views
2

私は完全にC#の一般的な新機能ですので、次の問題があります。私は2つのクラスを持っています。 1つのインスタンスベースおよび別の汎用クラス。 2番目のジェネリッククラスの1番目のクラスにプロパティを設定したいと思います。ジェネリッククラスを別のインスタンスクラスのプロパティにする方法は?

これらの行には何か....機能性があります。

public class SampleClass 
{ 
    private SampleGenericClass<T> sampleClass; 

    public SampleClass(string name, int age, string version) 
    { 
    if(version == "1.0") 
    { 
     this.sampleClass = new SampleGenericClass<int>(name, age); 
    } 
    else 
    { 
     this.sampleClass = new SampleGenericClass<long>(name.age); 
    } 
    } 

    public void Load() 
    { 
    this.sampleClass.Load(); 
    } 
    public void Open() 
    { 
    this.sampleClass.Open(); 
    } 
    public void Close() 
    { 
    this.sampleClass.Close(); 
    } 
} 

私の第二の一般的なクラスは、今私はCLRは、一般的なプロパティやコンストラクタをサポートdoesntのことを理解し、この

internal class SampleGenericClass<T> where T : class 
    { 
    private string name; 
    private string age; 

    public SampleGenericClass(string name, int age) 
    { 
     this.name = name; 
     this.age = age; 
    } 

    public void Load() 
    { 
     // Do something based on type 
     if(typeof(T) == typeof(int)) 
     { 
     // load int type 
     } 
     else if(typeof(T) == typeof (long)) 
     { 
     // load long type 
     } 
     else 
     { 
     throw new ArgumentException("Un supported type"); 
     } 
    } 
    public void Open() 
    { 
     // Do something based on type 
     if(typeof(T) == typeof(int)) 
     { 
     // open int type 
     } 
     else if(typeof(T) == typeof (long)) 
     { 
     // open long type 
     } 
     else 
     { 
     throw new ArgumentException("Un supported type"); 
     } 
    } 

    public void Close() 
    { 
     // Do something based on type 
     if(typeof(T) == typeof(int)) 
     { 
     // close int type 
     } 
     else if(typeof(T) == typeof (long)) 
     { 
     // close long type 
     } 
     else 
     { 
     throw new ArgumentException("Un supported type"); 
     } 
    }  

    } 

のようなものです。 どうすればこの問題を解決できますか?私はまだジェネリッククラスを持っていて、何とか第2クラスで、第1クラスのコンストラクタに渡されたparamsに基づいてインスタンス化します。つまり、第2クラスのload、openm、closeメソッドを呼び出します。

ありがとうございました。

注:上記のコードはコンパイルされないことを知っていますが、bcoz CLRは汎用プロパティとコンストラクタをサポートしていません。

public class SampleClass<T> where T : .... 
{ 
    private SampleGenericClass<T> sampleClass; 

    public SampleClass(string name, int age, string version) 
    { 
     this.sampleClass = new SampleGenericClass<T>(name, age); 
    } 

    public void Load() 
    { 
    this.sampleClass.Load(); 
    } 
} 

とあなたのSampleClassを作成します。それはちょうど私がIMOあなたが上位に決定すべき概念的

+0

プログラムにデザインフローがあります。あなたが使う型を知っているなら( 'int'と' long')、 'int'と' long'sを取る2つの実装を持つ抽象クラスを作成してください。 – GETah

答えて

2

を達成するために何をしたいの例示目的のためだ、あなたはジェネリックとしてそれを定義する必要があります実際にはSampleClassの種類は何ですか上位レベル(および関連する一般的なバージョン)のベース。

例えば:

主な方法:

if (version == "1") 
{ 
    DoAction<int>(); 
} 
else 
    DoAction<long>(); 

..... 
void DoAction<T>() 
{ 
    SampleClass<T> s = new SampleClass<T>(...) 
} 

また、私はあなたが関数呼び出しの下位レベルに移動することができますので、あなたは、あなたのメンバ変数のためのTタイプを必要としない見ることができるように。

+0

これはすべきです仕事のおかげで – user330612

2

いずれかの具体的なタイプ

public class SampleClass { 
    private SampleGenericClass<int> sampleClass; 
    ... 
} 

を宣言するかにジェネリック型パラメータを追加SampleClass

public class SampleClass<T> where T : class { 
    private SampleGenericClass<T> sampleClass; 
    ... 
} 
1

インタフェース:

public interface ISampleGenericClass 
    { 
     void Load(); 
     void Open(); 
     void Close(); 
    } 

ジェネリッククラスは、この実装

そしてSampleClass

public class SampleClass 
{ 
    private ISampleGenericClass sampleClass; 
.... 
} 

intとlong値の型ですので、私は、クラスの制約を取り除くので、彼らは現在の形で使用することはできません。

関連する問題