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因为它不需要通用参数

interface InterfaceB 
{
  InterfaceA FooUntyped();
}

...

foreach (InterfaceB item in bList) {
  aList.Add(item.FooUntyped());
}
于 2013-03-16T17:24:15.687 回答
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 回答
1

关键的见解是MyClass<int>MyClass<SomethingElse>是 100% 不相关的类型,因此您不能将它们一视同仁。甚至部分没有。就好像你写T1T2编译器一样。

所以你必须创建一个通用的基类/接口或使用dynamic.

于 2013-03-16T18:19:36.860 回答
-3

您不是在迭代 ClassB 的项目,而是在实际上没有指定 Foo 方法的 interfaceB 。

但是,无需检查:

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

于 2013-03-16T17:28:12.957 回答