2012-08-24 73 views
7

我有一種在如何投泛型類型,以適應另一個泛型方法

public IList<T> MyMethod<T>() where T:AObject 

類我想調用另一個泛型類B.這件T是不受任何約束這種方法。

public mehtodInClassB(){ 
    if (typeof(AObject)==typeof(T)) 
    { 
     //Compile error here, how can I cast the T to a AObject Type 
     //Get the MyMethod data 
     A a = new A(); 
     a.MyMethod<T>(); 
    } 
} 

C類繼承自Class AObject。

B<C> b = new B<C>(); 
b.mehtodInClassB() 

有什麼想法?

後URS提醒...更新:

是。我真正想要做的是

typeof(AObject).IsAssignableFrom(typeof(T)) 

typeof(AObject)==typeof(T)) 
+0

如果我們能看到更多的其他類做什麼,我們也許能夠提供更多的相關諮詢。 –

+0

'd'的類型是什麼?如果它是正確的類型,你可以不直接調用MyMethod而不需要傳入類型參數(例如'd.MyMethod()')? – Chris

+1

@Chris該方法是通用的,不需要參數。在這種情況下,您不能省略泛型類型參數,因爲無法從使用中推斷泛型類型參數。 –

回答

7

如果你知道TAObject,爲什麼不直接提供AObject作爲類型參數MyMethod

if (typeof(AObject).IsAssignableFrom(typeof(T))) 
{ 
    //Compile error here, how can I cast the T to a AObject Type 
    //Get the MyMethod data 
    d.MyMethod<AObject>(); 
} 

如果提供AObject作爲一個類型參數是不是一種選擇,你必須把相同的約束上T在調用方法:

void Caller<T>() where T: AObject 
{ 
    // ... 

    d.MyMethod<T>(); 

    // ... 
} 
+1

因爲AObject是基類在這裏 – ValidfroM

+2

你知道什麼,雖然,'的typeof(T)'只會等於'typeof運算(AObject)''如果是T''AObject'。我覺得你的意思'typeof運算(AObject).IsAssignableFrom(typeof運算(T))' –

+0

@Kendall弗雷同意。 – Dan

1

你不能這樣做,除非你把相同的約束上含有方法。泛型在編譯時被檢查,所以你不能做出這樣的運行時決定。

或者,你可以使用反射來調用方法,它只是需要更多一點的代碼。

參見這太問題上如何做到這一點的詳細信息:How do I use reflection to call a generic method?

+0

只要告訴編譯器做出什麼決定,你就可以做出運行時決定。如果您明確投射到AObject,那麼編譯器將知道它的一個AObject並可以正常工作。 – Chris

+0

@Chris你如何做一個泛型參數的鑄造? – CodingGorilla

+0

@Chris這裏的問題是AObject是一個基類。 T可以是AObject的派生類,不知道如何投射它。 – ValidfroM

相關問題