3
class Program
{
    public static void Main(string[] args)
    {
        List<MyInterface> myList = new List<MyInterface>();

        myList.Add(new MyClass<int>());

        foreach (MyInterface item in myList)
        {
            (MyClass)item).Foo(); // <---- Critical Line
        }
    }
}

interface MyInterface { }

class MyClass<T> : MyInterface
{
    public MyClass() { }
    public void Foo() { DoSomething(); }
}

オブジェクトの正確な(一般的な)タイプを知らずにのFoo()メソッドを使用したいと思います。MyClassとにかくそれを呼び出す方法はありますか?コードがいつコンパイルされるかがわかるTので、を介して実装されるプロパティにコードを格納できInterfaceBますか?

ご協力いただきありがとうございます!

編集:明確ではないことをお詫びします。実装するクラスは他にもありますがMyInterface、アイテムのタイプがClassBであるかどうかを確認しているため、に入れることができませFoo()MyInterface

4

4 に答える 4

2

静的に参照するにClassB<T>は、コードでジェネリックパラメーターを指定する必要があります。ClassBこの名前は、という名前の非ジェネリッククラスを参照するため、使用できませんClassB

InterfaceBこれを機能させるもう1つの方法は、ジェネリックパラメーターを必要としないため、必要な情報を追加することです。

interface InterfaceB 
{
  InterfaceA FooUntyped();
}

...

foreach (InterfaceB item in bList) {
  aList.Add(item.FooUntyped());
}
于 2013-03-16T17:24:15.687 に答える
1

重要な洞察は、MyClass<int>MyClass<SomethingElse>は 100% 無関係なタイプであるため、同じように扱うことはできないということです。部分的でもありません。T1T2コンパイラに書いたかのようです。

したがって、共通の基本クラス/インターフェースを作成するか、dynamic.

于 2013-03-16T18:19:36.860 に答える
1
interface MyInterface { }
interface MyFooInterface<T>
{
    List<T> Foo<T>();
}

class MyClass<T> : MyInterface, MyFooInterface<T>
{
    public MyClass() { }
    public List<T> Foo<T>() { DoSomething(); }
}

class MyClassB<T> : MyInfterface
{...}

...
        foreach (MyFooInterface item in myList.OfType<MyFooInterface>)
        {
            item.Foo();
        }
...
于 2013-03-16T17:54:24.817 に答える
-3

ClassB のアイテムを反復処理しているのではなく、実際には Foo メソッドを指定していない interfaceB を反復処理しています。

ただし、チェックせずに:

var itemB = item as ClassB; if (itemB != null){ itemB.Foo() }

于 2013-03-16T17:28:12.957 に答える