2008-12-10 514 views
0

我有兩個類:媒體和容器。列表泛型和鑄造

我有兩個列表List<Media>List<Container>

我傳遞這些列表給另一個函數(一次一個);

它可以是一個或另一個;

什麼是檢查列表的「模板」類型的正確方法,所以我可以根據列表類型調用asssociated方法?

或者我應該只是嘗試將其轉換爲列表<>並將Try/Catch塊放在它周圍?

Object tagObj = mediaFlow1.BackButton.Tag; 

    if (tagObj == Media) 
     //do this 
    else if (tagObj == Container) 
     //do this 
    else 
     throw new Exception("Not a recognized type"); 

回答

3

可以使用類型類型,像這樣的方法GetGenericArguments:

對象[]模板= myObject.GetType()GetGenericArguments();

11

正確的事情是有兩個重載這個函數,接受每一種類型:

public void MyMethod(List<Media> source) 
{ 
    //do stuff with a Media List 
} 

public void MyMethod(List<Container> source) 
{ 
    //do stuff with a Container List 
} 
2

什麼大衛說。

但是,如果這必須通過相同的功能,typeof運營商應該幫助。此外,這聽起來更像是你有一個建築缺陷。 Media類與Container類相關的方式如何?他們應該使用兩種通用界面嗎?

+0

是的,它應該共享相同的功能 - 它是一個事件處理程序 – 2008-12-10 20:19:23

0

那麼,這取決於你的「//做這個」方法是什麼......如果它是一種方法,在Media或Container對象上運行,並根據它執行不同的事情,那麼你應該把這種方法在這些類...

聲明接口命名ICanDoThis

public interface ICanDoThis { void DoThis(); } 

確保媒體和容器實現該接口

public class Media: ICanDoThis { // } 
public class Container: ICanDoThis { // } 

和那麼,在你的客戶端代碼「其他功能」,你可以

public void OtherFunction(List<ICanDoThis> list) 
{ 
    foreach(ICanDoThis obj in list) 
     obj.DoThis(); 
} 

就是這樣...此代碼將調用相應的實施無論是在媒體類或容器類這取決於實際的具體類型對象是,沒有你必須編寫代碼來區分它們...

+0

這將不會工作,直到.NET 4.0出來。通用參數還不知道繼承。 – 2008-12-10 20:32:22