2017-05-31 15 views
0

私は変更しようとしている別の投稿で見つかったクラスを持っています。Xml出力クラスから汎用クラス

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

    } 
} 

私はX型のオブジェクトを渡して保存したいと思います。同じ前提で、型を渡して、型Xのオブジェクトを返すようにしたいと思います。今、Configを使うのは難しいです。したがって、クラスオブジェクト(?)を渡す方法がある場合、そのオブジェクトとして保存したり、そのオブジェクトを返すことができます。

これは可能ですか?もしそうなら、私はこれをどうやってやりますか?

答えて

0

一般的な用途:

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

使用法:

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

素晴らしいです!タイム! – SomeoneSpecial

0

基本的に、我々はそれがジェネリックで動作させるために必要があると思います。そこで、我々はそれを型変数を与えることによって開始し、TでクラスConfigのすべての使用を置き換える:

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

次に、私はただ一つの方法をやります。あなたは残りをすることができます。 (そして私は明示的な名前空間が削除されていますが、それらは醜いものです)

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(); 
    } 
} 
関連する問題