2016-03-31 11 views
0

初めてカスタム設定セクションを作成しようとしています。一例として、C#カスタム設定セクションの作成が遅れて

、私は私のプログラムで読み込まれることをCSVファイルのリストを格納するためのカスタムセクションを作成したいと仮定 - 各ファイルを、それゆえ持つ:

  • ファイル
  • へのパス
  • Aデリミタ
  • CsvColumnのリスト(別のタイプ)

そして、各CsvColumnのような特性を有することができ:

(これは設定経由か行われてもいいかどうかを無視してください、これは階層構造を与えることを一例に過ぎないので、私はどのように学ぶことができ、型のファイル内の名前これをする)。今、私は例/ソリューションhereを与えられ、ひどく立ち往生しています基づいてカスタムクラスを作成しているよ、

<configSections> 
    <section name="CsvData" type="CSV_Loader.CsvData, CSV_Loader" /> 
</configSections> 

<CsvData> 
    <CsvFiles> 
     <CsvFile Path="MyPath1" Delimiter=","> 
      <CsvColumn NameInFile="Col1" Type="System.String"/> 
      <CsvColumn NameInFile="Col2" Type="System.String"/> 
      <CsvColumn NameInFile="Col3" Type="System.Double"/> 
     </CsvFile> 
     <CsvFile Path="MyPath2" Delimiter=","> 
      <CsvColumn NameInFile="Col1" Type="System.String"/> 
     </CsvFile> 
    </CsvFiles> 
</CsvData> 

そして:

だから、私は、次の設定ファイルを作成しました。次のように私の現在のコードは、おおよそになります

CsvColumn: FYI

public class CsvColumn : ConfigurationElement 
{ 
    [ConfigurationProperty("NameInFile", IsRequired = true, IsKey = true)] 
    public string NameInFile 
    { 
     get { return (string)this["NameInFile"]; } 
    } 

    [ConfigurationProperty("Type", IsRequired = true, DefaultValue = "")] 
    public string Type 
    { 
     get { return (string)this["Type"]; } 
    } 
} 

( - 私は実際Type変数として私Typeを保存したいのですが、私は念のためにStringとして設定しています私の問題があった場所だった)

たcsvfile:

[ConfigurationCollection(typeof(CsvColumn), AddItemName = "CsvColumn", CollectionType = ConfigurationElementCollectionType.BasicMap)] 
public class CsvFile : ConfigurationElementCollection 
{ 
    [ConfigurationProperty("Path", DefaultValue = "", IsKey = true, IsRequired = true)] 
    public string Path 
    { 
     get { return (string)(base["Path"]); } 
    } 

    [ConfigurationProperty("Delimiter", DefaultValue = ",", IsRequired = true)] 
    public string Delimiter 
    { 
     get { return (string)(base["Delimiter"]); } 
    } 

    public CsvColumn this[int index] 
    { 
     get { return (CsvColumn)BaseGet(index); } 
     set 
     { 
      if (BaseGet(index) != null) 
      { 
       BaseRemoveAt(index); 
      } 
      BaseAdd(index, value); 
     } 
    } 

    public void Add(CsvColumn column) 
    { 
     BaseAdd(column); 
    } 

    public void Clear() 
    { 
     BaseClear(); 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new CsvColumn(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((CsvColumn)element).NameInFile; 
    } 

    public void Remove(CsvColumn column) 
    { 
     BaseRemove(column.NameInFile); 
    } 

    public void RemoveAt(int index) 
    { 
     BaseRemoveAt(index); 
    } 

    public void Remove(String name) 
    { 
     BaseRemove(name); 
    } 
} 

たcsvfileコレクション:

[ConfigurationCollection(typeof(CsvFile), AddItemName = "CsvFile", CollectionType = ConfigurationElementCollectionType.BasicMap)] 
public class CsvFiles : ConfigurationElementCollection 
{ 
    public CsvFile this[int index] 
    { 
     get { return (CsvFile)BaseGet(index); } 
     set 
     { 
      if (BaseGet(index) != null) 
      { 
       BaseRemoveAt(index); 
      } 
      BaseAdd(index, value); 
     } 
    } 

    public void Add(CsvFile file) 
    { 
     BaseAdd(file); 
    } 

    public void Clear() 
    { 
     BaseClear(); 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new CsvFile(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((CsvFile)element).Path; 
    } 

    public void Remove(CsvFile file) 
    { 
     BaseRemove(file.Path); 
    } 

    public void RemoveAt(int index) 
    { 
     BaseRemoveAt(index); 
    } 

    public void Remove(String name) 
    { 
     BaseRemove(name); 
    } 
} 

CsvData:

public class CsvData : ConfigurationSection 
{ 
    [ConfigurationProperty("CsvFiles")] 
    public CsvFiles CsvFiles 
    { 
     get { return base["CsvFiles"] as CsvFiles; } 
    } 
} 

そして、私は次のように私のコードでそれを呼び出すようにしようとしています:

var csvData = (ConfigurationManager.GetSection("CsvData") as CsvData); 

をしかし、私は取得していますConfigurationExceptionUnrecognized element 'CsvColumn'。 そして、なぜ私は理解できません。

私の主な質問は以下のとおりです。私は間違って何をやっている

  1. この処理を簡単にする簡単な方法(Generic)がありますか?

ありがとうございます!

+1

を試してみました例外名 –

+0

@ChrisDunaway、申し訳ありませんが、私はそれを持っていましたが、それを投稿するのを忘れました....今すぐ追加します.... –

答えて

2

これがなぜ起こるか私はおそらく、フレームワークのバグわからないんだけど、あなたはこれらのネストされたConfigurationElementCollectionインスタンスを持っている場合には、インナーコレクションのConfigurationCollection属性にAddItemNameを無視しているようです。 CsvColumn要素をadd要素に変更すると、これを自分で確認することができ、適切に逆シリアル化されます。クラスはあなたの問題を解決する必要があり、あなたのCsvFileに次のコンストラクタを追加する

public CsvFile() 
    { 
     AddElementName = "CsvColumn"; 
    } 

あなたの2番目の質問については、あなたは、例外の完全な詳細を与えるだけではなく、してくださいライブラリにCsvHelper

+0

IT FREAKING WORKED !!!!!! - **ありがとう!!!! ** - 本当にありがとうございます! - これは私にNUTSに行く! –

+0

2番目の質問については、私はCSVファイルではなくConfigファイルを扱うための一般的な解決策に疑問を抱いています。 –

+0

ようこそ。私は一般的にカスタム設定セクションを扱うかどうかはわかりません。最近、私は自分自身の設定とJSONとしての格納のためにそれらをクリアする傾向があります。 –

関連する問題