2017-09-19 10 views
0

リストのaddメソッドでコンストラクタを呼び出すことによって、クラスのリストにクラスを追加しています:C#メソッドにパラメータとしてクラスを渡してパラメータクラスの基底クラスを決定する方法

SupportedTests.Add(new SpecificTestClass27()); 

しかし、私が使っているクラスは、派生クラスです(ほとんどの場合、彼らは4つまたは5つの基本クラスのチェーンを持っています)。使用するベースクラスに応じてリストに追加したいだけです(直後の基底クラスではなく、元のカップル基底クラスであるもの)

連鎖ベースクラスの例:

TestClass、およびそれらの2つの基本クラス上異なるクラスはトップクラスを含む、必ずしも同じではない:
public class SpecificTestClass27 : SpecificTestClass27_base 

public abstract class SpecificTestClass27_base: OperationTestClass_base 

public abstract class OperationTestClass_base: DomesticTestClass 

OR

public abstract class OperationTestClass_base: InternationalTestClass 

DomesticTestClas SとInternationalTestClass両方が同じ基本クラスから派生します。

私はそのコードを変更することはできませんが、私はこの方法に最終的にどちらかDomesticTestClassまたはInternationalTestClassから派生した特定のクラスを渡した後、リストに特定のクラスを追加することを決定するか、どのに依存しないの方法が必要ですそれが持っている基本クラス。

私は、通常の方法で作ってみた:

public void AddaTestClass(object SpecificTestClass) 
{ 
    if (base == DomesticTestClass) { SupportedTests.Add(new SpecificTestClass()); } 
} 

をしかし、それはクラスというパラメータが好きではなかったです。

public void AddaTestClass<<"SpecificTestClass">>() where SpecificTestClass : DomesticTestClass 
{ 
    SupportedTests.Add(new SpecificTestClass()); 
} 

public void AddaTestClass<<"SpecificTestClass">>() where SpecificTestClass : InternationalTestClass 
{ 

} 

注:私は、過負荷でジェネリックを使用しようとしたとき は、そして、私は私のプログラムでは、引用符でSpecificTestClassを持っていない、それはちょうどここの間に表示されません引用符のないキャラット

これは、new()制約がなく、オーバーロードなしでも失敗するため、クラスのコンストラクタを呼び出すことはできません。

これを行う別の方法がありますか、それとも不可能なのでしょうか?

答えて

0

新しいクラスを作成してコレクションに追加するため、generic型パラメータにnew constraintを追加する必要があるため、コンパイラにはパブリックなパラメータなしコンストラクタが保証されています。

public void AddADomesticTestClass<T>() where T: DomesticTestClass, new() 
{ 
    SupportedTests.Add(new T()); 
} 

public void AddAnInternationalTestClass<T>() where T: InternationalTestClass, new() 
{ 
    SupportedTests.Add(new T()); 
} 

また

public void AddATestClass<T>() where T: TestClass, new() 
{ 
    if (typeof(T).IsAssignableFrom(typeof(DomesticTestClass)) 
     || typeof(T).IsAssignableFrom(typeof(InternationalTestClass))) 
    { 
     SupportedTests.Add(new T()); 
    } 
} 
+0

動作しますが、私は、私は「T」として渡しているクラスが持っているかどうかわからないので、私は1つの方法にそれらを組み合わせることができますどのような方法があることがわかりました基本クラスDomesticTestClassまたはInternationalTestClass?上記のようにオーバーロードすることはできますか?それとも両方の基本クラスを使用してifステートメントを入れるべきですか? – jjumboshrimp

+0

@jjumboshrimp私の編集を参照してください。 – Romoku

+0

それはいくつかの魔法のとおりですが、うまくいきます。ありがとう! – jjumboshrimp

関連する問題