2013-03-16 97 views
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(); } 
} 

我想使用的MyClassFoo()方法不知道該對象的excact(通用)類型。有什麼方法可以調用它嗎?編譯代碼時我會知道T,所以我可以將它存儲在通過InterfaceB實現的屬性中?對象添加到集合不知道它的泛型類型

感謝您的幫助!

編輯:對不起,不清楚;還有其他類實現MyInterface,我正在檢查項目的類型是ClassB,所以我不能把Foo()放入MyInterface

+0

目前尚不清楚哪個界面對您很重要。你真的需要*'InterfaceA'和'ClassA'來證明你的問題,或者你真的只關心如何調用'Foo'? – 2013-03-16 17:25:02

+0

@Jon Skeet你是對的。我只是把它放在我的項目中遇到問題的方式。 – 2013-03-16 17:27:30

+1

在你的界面聲明'Foo'。 – 2013-03-16 17:32:24

回答

1

的主要觀點是,MyClass<int>MyClass<SomethingElse>是100%不相關的類型,所以你不能這樣對待他們一樣。甚至沒有部分。就好像你編寫了T1T2

所以你必須創建一個通用的基類/接口或使用dynamic

+1

謝謝! 「動態」最終成功了。 – 2013-03-16 18:44:16

2

爲了靜態引用ClassB<T>,您需要在代碼中指定通用參數。您不能使用名稱ClassB,因爲它會引用名爲ClassB的非泛型類。

的另一種方法,使這項工作是添加你需要到InterfaceB的信息,因爲它並不需要一個泛型參數

interface InterfaceB 
{ 
    InterfaceA FooUntyped(); 
} 

... 

foreach (InterfaceB item in bList) { 
    aList.Add(item.FooUntyped()); 
} 
-3

你不是遍歷ClassB的項,而是interfaceB這實際上並沒有指定一個Foo方法。

然而沒有檢查:

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

+0

沒有'ClassB'這樣的類型 - 只有* generic * type'ClassB <>',並且你不能在沒有提供類型參數的情況下檢查它的一個實例。 – 2013-03-16 17:37:53

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(); 
     } 
... 
+0

這很好,謝謝!但是,你是否也知道'Foo'返回'List '的解決方案? – 2013-03-16 18:06:30

+0

我想我是,已經更新回答 – Dima 2013-03-16 18:10:52

相關問題