2011-12-20 38 views
1

我在我的應用程序中使用silverlight 4.0。我在我的基類的方法,下面提到Silverlight 4.0協變的替代方案4.0 IEnumerable <T>

class BaseClass 
{ 
    protected CustomRequest GetCustomRequest(IEnumerable<IRequestType> types) 
    { 
     //Some code here... 
    } 
} 

在我的派生類時,我把這種方法就像下面我在這裏,在調用語句requestTypes的類型是得到錯誤

IEnumerable<RequestType> requestTypes = CodeToGetThis(); 
GetCustomRequest(requestTypes) 

注衍生類型的IRequestType的枚舉

由於在c#4.0中引入了協方差,這在桌面應用程序中效果很好。但對於Silverlight 4.0來說,它似乎並沒有爲IEnumerable接口完成。

那麼,我應該在我的silverlight應用程序中爲此使用什麼最佳替代方法?

我在某處讀到它可以使用方法重載完成,但不知道如何執行此操作。

UPDATE: 一件事,我在這個問題的第一稿錯過的是,我將有很多派生類型IRequestType的,因此craeating每個派生類型重載的方法將是對我來說是困難的。

回答

1

只需將每個項目投射到界面上,例如

IEnumerable<IRequestType> requestTypes = CodeToGetThis().Select(x => (IRequestType)x); 
GetCustomRequest(requestTypes) 

你就可以用方法重載的東西,有一個把你的派生/混凝土類型的方法,但你只會落得做類似上面的,並呼籲在過載的原始方法。

+0

謝謝。我試過這個,這個工程。 您認爲這比重載更好嗎? – Maheep 2011-12-20 13:18:21

+0

這取決於,無論如何,您需要在重載的方法中執行此操作。如果重載使得你的代碼更加清晰,並且你有很多調用這個方法的實例,那麼就執行它,如果它是一個或兩個,那麼它可能會被殺死。 – 2011-12-20 13:27:50