2011-12-11 43 views
0

我使用此代碼加載數據,並將其轉換爲一個類型,我得到它的使用泛型方法:通用鑄造不起作用

public List<TResult> LoadFromeStreamFile<TResult>(string Location) 
    { 
     List<TResult> result = new List<TResult>(); 

     StreamReader reader = new StreamReader(Location); 

     while (!reader.EndOfStream) 
     { 
      result.Add((TResult)reader.ReadLine()); 
     } 

     reader.Close(); 

     return result; 
    } 

但我有錯誤在此代碼result.Add((TResult)reader.ReadLine()); 我怎麼能投stringTResult ??

回答

8

該演職員表不能可能工作,除非TResultobjectstring。假設你是實際上試圖建立類似的實體,我會要麼建議你在你使用LINQ一個Func<string, TResult>或(最好)傳球 - 這樣你就不會需要這個方法在所有:

var list = File.ReadLines(location) 
       .Select(line => new SomeEntity(line)) 
       .ToList(); 

如果你還是想方法,你可能使用

public static List<TResult> LoadFromFile<TResult>(string location, 
                Func<string, TResult> selector) 
{ 
    return File.ReadLines(location).Select(selector).ToList(); 
} 

...但我不知道它是否是值得的。我想,如果你這樣做了很多...

(在一個側面說明,當你做需要從文件中讀取,您應該使用using語句,使您的文件句柄被關閉,即使拋出異常。)

+0

什麼是SomeEntity,如何使用Func ? –

+0

@ahmadalishafiee:它會是你想要創建的任何類型 - 你將*作爲'TResult'傳入的類型。我建議你可能根本不需要通用方法。將編輯。 –

+0

我想爲我的項目編寫一個助理類。我看到很多次我想加載數據,但在一些不同的類型。我想做一個通用的方法來加載數據並根據需要返回數據類型。我可以如何這樣做沒有泛型方法? –

-1

您可以通過在「TResult」中實現顯式類型轉換運算符來實現此目的。 顯式從對象轉換爲TResult。

MSDN Reference

這實際上是「的方式」一樣具有「TResult」,其能夠從給定對象(有一些假設)創建一個構造的構造函數。

+0

顯式轉換運算符不受泛型的支持,對某些基類沒有約束,然後結果只能是該貝司類。另外,這裏的接口並不好,因爲你沒有實例調用該方法。 –

+0

編輯我關於接口使用的答案。不知道泛型不支持顯式轉換。被錯誤地幫助學習。謝謝。 –