如何根据参数转换对象类型?

时间:2012-09-26 17:40:34

标签: c# casting xml-deserialization

我有一个简单的问题,但我不确定处理它的最佳方法是什么。

我有几个不同的设置文件,我有一个GetData方法,它接收'path'参数。

        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参数并从那个方向获取对象的类型吗?

谢谢!

3 个答案:

答案 0 :(得分: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; 
    } 
} 

答案 1 :(得分: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;
    }
}

答案 2 :(得分: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; 
    } 
}