2012-05-31 9 views
0

說我有一類在運行時除了泛型類型未知的對象上的調用方法?我應該只使用動態?

public abstract class A<T> 
{ 
    public T GetT{get;} 

    public ISomeInterface AMethod{get;} 
} 

然後我在另一個類,我需要一個物體一些其他的方法,我要檢查它是A<>類型,那麼,如果它是獲得T類型和調用方法AMethod。所以我這樣做:

if (theObject.GetType().GetGenericTypeDefinition() == typeof (A<>)) 
{ 
    Type TType = theObject.GetType().GetGenericArguments()[0];    
    dynamic dynamicObject= theObject; 
    ISomeInterface filter = dynamicObject.AMethod; 
    //...some other stuff using TType 
} 

有沒有辦法做到這一點不使用動態對象,因爲我不能使用TType聲明變量的類型或使用泛型類型確定指標A<>在運行時...

回答

4

如果你能,把所有的非通用的東西,在一個抽象的非通用基礎類:

public abstract class A 
{ 
    public ISomeInterface AMethod{get;} 
} 

public abstract class A<T> : A 
{ 
    public T GetT{get;} 
} 

然後,你可以使用:

A foo = theObject as A; 
if (foo != null) 
{ 
    ISomeInterface filter = foo.AMethod; 
} 
+0

謝謝,但是如果我不能將東西拉入非泛型基類,那麼使用'dynamic'就像我將要獲得的一樣好? –

+0

那麼你可以使用一些明確的反射來拉出並調用屬性getter;但這是好還是壞會有爭議。 –

1

正如Skeet先生所提到的那樣,將不依賴類類型的項目拉入非泛型類或接口通常是實用的方法。否則,我會建議編寫一個類型參數爲T的泛型方法,該方法將返回一個通用單例(通過Reflection生成),該單例可以將對象傳遞給泛型方法,參數類型爲U,例如T:A<U>。對於任何特定類型的T,這種方法只需要使用Reflection一次,無論它用於處理該類型的實例多少次。

由於代表只與封閉泛型可用,人們可能必須定義一些通用接口:

 
// User code will supply an implementation of one of these interfaces to the dispatching 
// object, which will call its "Act" method with a proper type 
interface IActUponGenericA 
{ 
    void Act<T>(A<T> param); 
} 
interface IActUponGenericA<PT1> 
{ 
    void Act<T>(A<T> param, PT1 extraParam1); 
} 
interface IActUponGenericA<PT1,PT2> 
{ 
    void Act<T>(A<T> param, PT1 extraParam1, PT2 extraParam2); 
} 
// The dispatching object itself will implement this interface: 
interface IWrapActUponGenericA<T> 
{ 
    void CallAction(IActUponGenericA act, T param); 
    void CallAction<PT1>(IActUponGenericA<PT1> act, T param, PT1 extraParam1); 
    void CallAction<PT1,PT2>(IActUponGenericA<PT1,PT2> act, T param, 
          PT1 extraParam1, PT2 extraParam2); 
} 

然後給定的參數類型T(這對於一些Q實現A<Q>)時,基於反射的方法代碼將生成一個實現接口IWrapActUponGenericA<T>的單例。該實現可以採用T類型的對象和IActUponGenericA的實現,並調用該實現的方法Act<Q>

這種方法比使用dynamic更復雜,可能會或可能不會更好;但是,它將能夠處理dynamic無法處理的一些情況。

相關問題