2012-09-26 48 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; 
    } 
} 
相关问题