2012-09-26 47 views
2

我有一個簡單的問題,但我不知道什麼來處理它的最佳方式。如何根據參數強制轉換對象類型?

我有幾個不同的設置文件,並且我有一個GetData方法,它接收一個「路徑」參數。

 public static CountriesInfo GetDataFromFile(string path) 
    { 
     if (!File.Exists(path)) 
     { 
      return null; 
     } 

     try 
     { 
      CountriesInfo tempData = new CountriesInfo(); 
      System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(tempData.GetType()); 
      StreamReader tempReader = new StreamReader(path); 
      tempData = (CountriesInfo)x.Deserialize(tempReader); 
      tempReader.Close(); 
      return tempData; 
     } 
     catch 
     { 
      return null; 
     } 
    } 

什麼是最好的方式來重構這支持傳遞一個對象類型,然後在該方法內進行強制轉換?眼下的返回類型(在這個例子中)是CountriesInfo,但我不希望有一些相同的功能,唯一的區別是返回類型和方法中的鑄造。

它是最好做的東西像傳遞ref參數和從對象獲取類型呀?

謝謝!

回答

6

使用泛型方法來代替:

public static T GetDataFromFile<T>(string path) where T : class 
{ 
    if (!File.Exists(path)) 
    { 
     return null; 
    } 

    try 
    { 
     System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(T)); 
     StreamReader tempReader = new StreamReader(path); 
     T result = (T)x.Deserialize(tempReader); 
     tempReader.Close(); 
     return result; 
    } 
    catch 
    { 
     return null; 
    } 
} 
+0

這將不會編譯 - 你不能轉換爲null,無限制的類型'T' – Lee

+1

權,錯過了T必須是一個類的限制(現在又增加了它)。如果用戶也想支持結構,另一種選擇是返回'default(T)'而不是'null',在這種情況下,約束不是必需的。 – carlosfigueira

+0

很棒。謝謝! – kodikas

3
public static T GetDataFromFile<T>(string path) where T : class 
{ 
    if (!File.Exists(path)) 
    { 
     return null; 
    } 

    try 
    { 
     System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(T)); 
     using(StreamReader tempReader = new StreamReader(path)) 
     { 
      return (T)x.Deserialize(tempReader); 
     } 
    } 
    catch 
    { 
     return null; 
    } 
} 
+0

謝謝你的答案也...我已經修改我的包括使用塊。乾杯! – kodikas

0
來處理這個

最簡單的方法是使用Convert.ChangeType方法並返回一個動態類型嘗試這樣的事:

public static dynamic GetDataFromFile(string path, Type convertType) 
    { 
     if (!File.Exists(path)) 
    { 
     return null; 
    } 

    try 
    { 
     CountriesInfo tempData = new CountriesInfo(); 
     System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer (tempData.GetType()); 
     StreamReader tempReader = new StreamReader(path); 
     tempData = (CountriesInfo)x.Deserialize(tempReader); 
     tempReader.Close(); 
     return Convert.ChangeType(CountriesInfo, convertType); 
    } 
    catch 
    { 
     return null; 
    } 
} 
相關問題