0

IFeaturesA、IFeaturesB という 2 つのインターフェイスがあるとします。

IFeaturesA には一連の署名メソッドがあります。1つは次のとおりです。

public void printMe();

IFeaturesB は IFeaturesA を実装し、次のような新しい署名方法を追加します。

public void printMeAlso();

次のような一般的な方法を使用したいとします。

public Check<E>(E passedItem)
{

}

IFeaturesA を渡した場合、このメソッドを呼び出せるようにしたいと考えています。IFeaturesB を渡す場合、追加のメソッド printMeAlso(); を呼び出せるようにします。

ジェネリック メソッドに渡されたインターフェイス型をチェックし、C# でそのメソッドにアクセスする最良の方法は何ですか? 2 つのインターフェイス タイプに対してオブジェクト タイプをチェックしてから、そのタイプにキャストするのが最適な方法ですか?

4

7 に答える 7

4

それはジェネリックには適合しません

ジェネリックは、動作ののない再利用です。タイプをチェックする必要がある場合、ジェネリックには適していません。制約を課すことはできますが、ジェネリック メソッドで実際の型をチェックしてはなりません。

抽象化しようとしているのは、 item を渡しているという事実だけです。それは抽象化ではありません。

于 2012-04-18T11:31:42.063 に答える
2

2つの方法を使用する

public Check(IFeaturesA passItem){

}

public Check(IFeaturesB passItem){

}

共通性を処理するためのプライベートメソッドを追加する

于 2012-04-18T11:36:57.380 に答える
1

アイテムのタイプを確認する場合は、「is」を使用します。

if (passedItem is IFeatureA) { }

ジェネリックをインターフェースまたは抽象クラスで定義できる特定の動作に制限する場合は、「where」を使用します。

public class foo<E> where E : IFeatureA
{
}

後者の場合、IFeatureBを使用することはできませんが、タイプEのクラスの変数は、タイプをチェックせずにIFeatureAで定義されたメソッドとプロパティを使用できます。

やりたいことに近いので、タイプDynamicを確認することもできます。

于 2012-04-18T11:36:47.080 に答える
1

インターフェイスを定義することで目的を達成するのは良い方法だとは思わないでください。単純に classe 構造を定義してください。

public class FeaturesA
{
    public virtual void printMe()
    {  
    }

}

public class FeaturesB : FeaturesA
{
    public override void printMe()
    {  
    }

}

コードで使用した後、

FeaturesA a = new FeaturesA(); 
FeaturesA b = FeaturesB();
public Check(A passedItem)
{
    passedItem.printMe();
}

Check(a) 版画 a、版画Check(b)b

お役に立てれば。

于 2012-04-18T11:34:24.773 に答える
0

これは、別のインターフェースの呼び出しのように見えます。

IPrintableメソッドのみを含むから両方のインターフェースを継承させ、 withPrint()を拡張するCheck<E>(E passedItem)where E : IPrintable、 を呼び出すことができますpassedItem.Print()

于 2012-04-18T11:34:41.703 に答える
0

以下を試してください

Check(IFeaturesA f) {}
Check(IFeaturesB f){}
Check<T>(T obj) where T : IFeaturesA, IFeaturesB {}
于 2012-04-18T11:34:52.063 に答える
0

私はEのようなタイプをチェックします

if(E.GetType().Equals(typeof(IFeaturesA)){ //call method...}
于 2012-04-18T11:31:55.100 に答える