【发布时间】:2016-07-20 00:09:01
【问题描述】:
我正在尝试第一次实现创建自定义配置部分,并且非常失败。
例如,假设我想创建一个自定义部分来存储要由我的程序读取的 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,对不起,我有它,但后来忘记发布了....我现在添加它....
标签: c# .net configuration app-config configuration-files