我想实现第一次创建一个自定义配置部分,我越来越殴打。C#卡住创建自定义配置部分
举个例子,假设我想创建一个自定义的部分,用于存储的CSV文件的列表我的程序读取 - 每个文件,因此它具有:
- 的路径,该文件
- 定界符的
- 甲列表
CsvColumn
(另一种类型)
然后,每个CsvColumn
可具有如特性:
- 文件中
- 它的类型
(请忽略这是否是好事,可以通过配置或没有这样做,这只是一个例子,给出一个层次,所以我可以学习如何名称去做这个)。
所以,我创建了以下配置文件:
<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>
而且,现在我希望建立基于给定here和我越来越可怕卡住的例子/解决方案的定制类。我当前的代码看起来大致如下:
CsvColumn:
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'
。 而我不明白为什么。
我的主要问题是:
- 我在做什么错?
- 有没有更容易(通用)的方式来实现这将使这个过程更容易?
非常感谢!
请给异常的全部细节,而不仅仅是例外名称。 –
@ChrisDunaway,对不起,我有它,但后来忘了发布....我现在将它添加.... –