リストの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()制約がなく、オーバーロードなしでも失敗するため、クラスのコンストラクタを呼び出すことはできません。
これを行う別の方法がありますか、それとも不可能なのでしょうか?
動作しますが、私は、私は「T」として渡しているクラスが持っているかどうかわからないので、私は1つの方法にそれらを組み合わせることができますどのような方法があることがわかりました基本クラスDomesticTestClassまたはInternationalTestClass?上記のようにオーバーロードすることはできますか?それとも両方の基本クラスを使用してifステートメントを入れるべきですか? – jjumboshrimp
@jjumboshrimp私の編集を参照してください。 – Romoku
それはいくつかの魔法のとおりですが、うまくいきます。ありがとう! – jjumboshrimp