Как привести тип объекта к параметру?

У меня простая проблема, но я не уверен, как лучше с ней справиться.

У меня есть несколько разных файлов настроек, и у меня есть метод 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;
        }
    }

Как лучше всего реорганизовать это, чтобы поддержать передачу типа объекта, а затем выполнить приведение из метода? Сейчас типом возвращаемого значения (в этом примере) является CountryInfo, но я не хочу иметь несколько идентичных функций, с той лишь разницей, что тип возвращаемого значения и приведение в методе.

Лучше всего сделать что-то вроде передачи параметра ref и таким образом получить тип объекта?

Спасибо!


person kodikas    schedule 26.09.2012    source источник


Ответы (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)); 
        StreamReader tempReader = new StreamReader(path); 
        T result = (T)x.Deserialize(tempReader); 
        tempReader.Close(); 
        return result; 
    } 
    catch 
    { 
        return null; 
    } 
} 
person carlosfigueira    schedule 26.09.2012
comment
Это не будет компилироваться - вы не можете преобразовать null в неограниченный тип T - person Lee; 26.09.2012
comment
Правильно, пропустил ограничение, что T должен быть классом (добавлено сейчас). Другой вариант, если пользователь также хочет поддерживать структуры, - это вернуть default(T) вместо null, и в этом случае ограничение не потребуется. - person carlosfigueira; 26.09.2012

Самый простой способ справиться с этим - использовать метод 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; 
    } 
} 
person Seth Greenstein    schedule 26.09.2012

person    schedule
comment
Спасибо за ответ ... Я изменил свой, чтобы включить блок using. Ваше здоровье! - person kodikas; 26.09.2012