2011-09-02 206 views
1

在Java中,我可以有一個方法聲明是這樣的:泛型列表方法指定類型

<T> List<T> getList(final Class<T> objectClass, String whatever) 

這意味着我通過指定類的方法指定列表返回類型。

List<Customer> customers = getList(Customer.class, "blah"); 

如果我沒有正確指定的類我得到一個編譯時錯誤。 (這就是我正在尋找的東西 - 我希望編譯器捕捉不匹配)。

List<String> customers = getList(Customer.class, "blah"); // will not compile 

在C#中相當於什麼? TIA

回答

3

C#中沒有辦法讓編譯器根據返回類型推斷泛型類型。

List<Customer> customer = getList<Customer>("blah"); 

這個方法應該寫成:

在C#中,你必須要是唯一的區別是返回類型指定牛逼

List<T> getList<T>(string whatever) { ... } 

然而,在C#中,類型推斷是自動如果有一個參數需要某種類型的客戶,則進行處理。例如,你可以有:

List<T> MakeList<T>(params T[] items) { ...} 

然後調用此爲(無<Customer>):響應

Customer one = GetCustomer(1); 
Customer two = GetCustomer(2); 

var customers = MakeList(one, two); 

編輯評論:

如果你將要構建一個新的「客戶」在你的方法中,並且希望這可以用於任何類型,你需要一個新的約束。有這樣的:

你會需要這樣的東西:

List<T> GetList<T>(string whatever) 
    where T : new() // This lets you construct it internally 
{ 
    List<T> results = new List<T>(); 

    /// ... 
    T newInstance = new T(); 

    results.Add(newInstance); 
    return results; 
} 

話雖這麼說,如果你打算做一個方法是這樣,那麼你還需要有一個約束的接口,所以你可以設置你創建對象:

List<T> GetList<T>(string whatever) 
    where T : ISomeInterface, new() 

這將讓你使用的ISomeInterface性能的方法中,以及將其限制爲只與即時通訊工作類型感謝那個接口。

+0

那麼,如何在該方法可以確定哪種類型實例化添加到我的列表? – sproketboy

+0

@Dan:我剛剛編輯過 - 看看是否能回答你的問題......(跨語言概念總是很棘手,因爲它們在C#和Java中並不完全相同) –

+0

謝謝。那塊石頭! :) – sproketboy

2

試試這個:

List<T> getList<T>(String whatever) { 
. 
. 
. 
. 
} 

此任務調用者指定T的類型,而調用方法。

+0

但是在這種情況下的語法我不能引用噸的方法體來知道哪種類型的對象實例化。 – sproketboy

+0

@Dan:就我所知,問題中沒有提到這個要求。也許你應該編輯它來反映你實際想問的問題。 – jalf

+0

您可以在該方法中使用typeof(T)。 – Chandu

3

我認爲這只是

List<T> GetList<T>(string whatever) { /* ... */ } 

你可以把一個約束對T像

List<T> GetList<T>(string whatever) 
where T : class 
{ /* ... */ } 

,如果你想將它約束上課。

1

<T> List<T> getList(final Class<T> objectClass, String whatever)

到:

List<T> GetList<T>(string whatever) 

List<Customer> customers = getList(Customer.class, "blah");

到:

List<String> customers = getList(Customer.class, "blah"); //將無法編譯

到:

List<string> = GetList<Customer>("blah"); // will not compile too 

的兩種語言如此接近