2012-01-06 42 views
2

我有一個包含特殊集合的泛型類。該集合的一個實例作爲對象傳遞給一個方法。現在我必須調用其中一個泛型類的方法。我看到的問題是我不知道集合中哪些類型的項目是這樣的,以至於在使用屬性之前我無法投射。調用作爲對象傳遞的泛型類實例的方法

public class MyGenericCollection<T>: ReadOnlyObservableCollection<T> 
{ 
    public bool MyProperty 
    { 
    get 
    { 
     // do some stuff and return 
    } 
    } 
} 

public bool ProblematicMethod(object argument) 
{ 
    MyGenericCollection impossibleCast = (MyGenericCollection) argument; 
    return impossibleCast.MyProperty; 
} 

有沒有辦法解決這個問題?

回答

8

在這種情況下,它可能是值得加入包含所有非泛型成員的接口:

public IHasMyProperty 
{ 
    bool MyProperty { get; } 
} 

然後進行收集實現:

public class MyGenericCollection<T>: ReadOnlyObservableCollection<T>, 
    IHasMyProperty 

在隨後採取IHasMyProperty你方法:

public bool ProblematicMethod(IHasMyProperty argument) 
{ 
    return argument.MyProperty; 
} 

或繼續服用object,但c AST的接口:

public bool ProblematicMethod(object argument) 
{ 
    return ((IHasMyProperty)argument).MyProperty; 
} 

在其他情況下你可以有,你的通用類擴展非泛型抽象基類,但在這種情況下,你已經從一個普通類(ReadOnlyObservableCollection<T>)推導出其刪除了選項。

+1

'IHasMyProperty',真實的,但'ICanHasCheezburger'? http://icanhascheezburger.com/ – phoog 2012-01-06 21:16:53

+0

謝謝!這就是訣竅:) – sjanz 2012-01-07 10:10:57

1

我喜歡的界面喬恩建議,但你也可以嘗試鑄造它用不同的方式:

public bool ProblematicMethod(object argument) 
{ 
    MyGenericCollection impossibleCast = argument as MyGenericCollection; 
    if(impossibleCast != null) 
    return impossibleCast.MyProperty; 

    // Other castings? 
    return false; 
} 
+0

我也試過這個,但我想我將不得不添加一些額外的魔法才能投射到非泛型類型MyGenericCollection而不是MyGenericCollection 。 – sjanz 2012-01-07 10:12:13

相關問題