初めてカスタム設定セクションを作成しようとしています。一例として、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);
をしかし、私は取得していますConfigurationException
Unrecognized element 'CsvColumn'
。 そして、なぜ私は理解できません。
私の主な質問は以下のとおりです。私は間違って何をやっている
- ?
- この処理を簡単にする簡単な方法(Generic)がありますか?
ありがとうございます!
を試してみました例外名 –
@ChrisDunaway、申し訳ありませんが、私はそれを持っていましたが、それを投稿するのを忘れました....今すぐ追加します.... –