2013-04-12 2 views
3

У меня есть этот кусок кода:Можно ли использовать дженерики для возврата фактического объекта?

private object DeserialiseFromXMLFile(string fileLocation, Type type) 
{ 
    XmlSerializer serializer = new 
     XmlSerializer(type); 

    FileStream fs = new FileStream(fileLocation, FileMode.Open); 
    XmlReader reader = new XmlTextReader(fs); 
    return serializer.Deserialize(reader); 
} 

Я интересно, если я использую дженерики, потому что я хотел бы тип возвращаемого быть T

Кто-нибудь знает, если это возможно, или это самое элегантное решение?

Заранее спасибо

ответ

6
private T DeserialiseFromXMLFile<T>(string fileLocation) 
{ 
    XmlSerializer serializer = new 
     XmlSerializer(typeof(T)); 

    FileStream fs = new FileStream(fileLocation, FileMode.Open); 
    XmlReader reader = new XmlTextReader(fs); 
    return (T)serializer.Deserialize(reader); 
} 

Вы можете назвать это таким образом:

User item = DeserialiseFromXMLFile<User>("myFile.xml"); 
1

Вы можете сделать:

private T DeserialiseFromXMLFile<T>(string fileLocation) 
{ 
    XmlSerializer serializer = new 
     XmlSerializer(typeof(T)); 

    FileStream fs = new FileStream(fileLocation, FileMode.Open); 
    XmlReader reader = new XmlTextReader(fs); 
    return (T)serializer.Deserialize(reader); 
} 

The typeof(T) возвращает Type экземпляр для типа T и в конце вы явно бросаете объект, возвращенный seria lizer до T.

1
private static T DeserialiseFromXMLFile<T>(string fileLocation)  { 
     XmlSerializer serializer = new XmlSerializer(typeof(T)); 

     FileStream fs = new FileStream(fileLocation, FileMode.Open); 
     XmlReader reader = new XmlTextReader(fs); 

     return (T)serializer.Deserialize(reader); 
    } 
1

Что-то вроде этого, что вы ищете?

private T DeserialiseFromXMLFile<T>(string fileLocation) 
{ 
    XmlSerializer serializer = new 
     XmlSerializer(typeof(T)); 

    FileStream fs = new FileStream(fileLocation, FileMode.Open); 
    XmlReader reader = new XmlTextReader(fs); 
    return (T) serializer.Deserialize(reader); 
} 

Использование затем:

var foo = DeserialiseFromXMLFile<Foo>("Foo.xml"); 

Если вам не нравится, чтобы не задавать Foo в явном виде, вы можете изменить метод

private void DeserialiseFromXMLFile<T>(string fileLocation, out T t) 
{ 
    ... 
    t = (T) serializer.Deserialize(reader); 
} 

, который вы могли бы назвать, как

Foo foo; 
DeserialiseFromXMLFile("Foo.xml", out foo); 

Ваш код также может использовать using:

private T DeserialiseFromXMLFile<T>(string fileLocation) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 

    using (var fs = new FileStream(fileLocation, FileMode.Open)) 
    { 
     var reader = new XmlTextReader(fs); 
     return (T) serializer.Deserialize(reader); 
    } 
} 
Смежные вопросы