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;
        }
    }

重构它以支持传递对象类型,然后从方法内进行强制转换的最佳方法是什么?现在返回类型(在这个例子中)是国家信息,但我不想有几个相同的函数,唯一的区别是返回类型和方法中的转换。

最好做一些事情,比如传递一个 ref 参数并以这种方式从对象中获取类型?

谢谢!

4

3 回答 3

7

请改用通用方法:

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; 
    } 
} 
于 2012-09-26T17:43:12.867 回答
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;
    }
}
于 2012-09-26T17:43:48.827 回答
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; 
    } 
} 
于 2012-09-26T17:57:32.240 回答