2017-05-31 6 views
0

Ich habe eine Klasse, die ich in einem anderen Beitrag gefunden habe, den ich ändern möchte.Xml-Ausgabeklasse zu generischer Klasse

using System; 
using System.IO; 

namespace Misc 
{ 
    internal class ConfigManager 
    { 

    private string _sConfigFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, string.Format("{0}.xml", AppDomain.CurrentDomain.FriendlyName)); 
    private Config m_oConfig = new Config(); 

    public Config MyConfig 
    { 
     get { return m_oConfig; } 
     set { m_oConfig = value; } 
    } 

    // Load configuration file 
    public void LoadConfig() 
    { 
     if (System.IO.File.Exists(_sConfigFileName)) 
     { 
     System.IO.StreamReader srReader = System.IO.File.OpenText(_sConfigFileName); 
     Type tType = m_oConfig.GetType(); 
     System.Xml.Serialization.XmlSerializer xsSerializer = new System.Xml.Serialization.XmlSerializer(tType); 
     object oData = xsSerializer.Deserialize(srReader); 
     m_oConfig = (Config)oData; 
     srReader.Close(); 
     } 
    } 

    // Save configuration file 
    public void SaveConfig() 
    { 
     System.IO.StreamWriter swWriter = System.IO.File.CreateText(_sConfigFileName); 
     Type tType = m_oConfig.GetType(); 
     if (tType.IsSerializable) 
     { 
     System.Xml.Serialization.XmlSerializer xsSerializer = new System.Xml.Serialization.XmlSerializer(tType); 
     xsSerializer.Serialize(swWriter, m_oConfig); 
     swWriter.Close(); 
     } 
    } 

    } 
} 

Ich würde gerne ein Objekt vom Typ X übergeben und speichern lassen. Unter derselben Voraussetzung würde ich gerne einen Typ übergeben und ihn das Objekt vom Typ X zurückgeben lassen. Im Moment ist es hart programmiert, Config zu verwenden. Wenn es also eine Möglichkeit gibt, das Klassenobjekt (?) Zu übergeben, möchte ich, dass es als Objekt gespeichert und/oder von diesem Objekt zurückgegeben wird.

Ist das möglich? Wenn ja, wie würde ich das tun?

Antwort

0

Verwendung generic:

internal class ConfigManager<T> 
{ 
    private string _fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, string.Format("{0}.xml", AppDomain.CurrentDomain.FriendlyName)); 
    private T _config; 
    private XmlSerializer serializer = new XmlSerializer(typeof(T)); 

    public T MyConfig 
    { 
     get { return _config; } 
     set { _config = value; } 
    } 

    public void LoadConfig() 
    { 
     if (File.Exists(_fileName)) 
     { 
      using (var reader = File.OpenText(_fileName)) 
      { 
       _config = (T)serializer.Deserialize(reader); 
      } 
     } 
    } 

    public void SaveConfig() 
    { 
     using (var writer = File.CreateText(_fileName)) 
     { 
      serializer.Serialize(writer, _config); 
     } 
    } 
} 

Verbrauch:

var man = new ConfigManager<Foo>(); 
+0

funktioniert super! Tyvm! – SomeoneSpecial

0

Grundsätzlich würden wir brauchen, um es mit Generics arbeiten zu lassen. So beginnen wir mit ihm eine Variable vom Typ geben, und ersetzen Sie jede Verwendung der Klasse Config mit T:

internal class Manager<T> 
{ 
     private T m_oObj;  // etc 

Als nächstes werde ich nur tun, ein Verfahren; Sie können den Rest erledigen. (und ich bin die expliziten Namespaces entfernt, weil sie hässlich sind)

using System.IO; 
using System.Xml.Serialization; 

public void LoadConfig<T>() 
{ 
    if (File.Exists(_sConfigFileName)) 
    { 
    var srReader = File.OpenText(_sConfigFileName); 
    var xsSerializer = new XmlSerializer(typeof(T)); 
    var oData = xsSerializer.Deserialize(srReader); 
    m_oObj = (T)oData; 
    srReader.Close(); 
    } 
} 
Verwandte Themen