【发布时间】:2023-04-01 02:10:01
【问题描述】:
我正在尝试使用嵌套元素进行配置。 但是父子关系是一对一的,而不是一对多的。 意思是 storageProvider 只能有一个 nestedProvider。
嵌套层级不受限制。
...
<store storeName="123">
<storageProvider type="disk">
<nestedProvider type="share">
<nestedProvider type="amazon-s3">
</nestedProvider>
</nestedProvider>
</storageProvider>
</store>
...
问题 当我使用 NestedProvider 属性创建 StorageProviderElement 并尝试读取配置时,我在 mscorlib 中捕获了 StackOverflowException。就像 .NET 中有一个错误(我使用 .NET 4.5)
我做错了什么还是预期的行为?
此时我不得不将此属性更改为一个集合(就像您以任何其他方式所做的那样),但我仍然想知道为什么我不能制作嵌套的一对一元素。
代码: 存储元素
public class StoreElement : ConfigurationElement
{
private const string storeName = "storeName";
private const string storageProvider = "storageProvider";
[ConfigurationProperty(storeName, IsKey = true, IsRequired = true)]
public string StoreName
{
get
{
return (string)base[storeName];
}
}
[ConfigurationProperty(storageProvider, IsRequired = true)]
public StorageProviderElement StorageProvider
{
get
{
return (StorageProviderElement)this[storageProvider];
}
}
}
StorageProviderElement (这是递归的)
public class StorageProviderElement : ConfigurationElement
{
private const string type = "type";
private const string options = "options";
private const string nestedProvider = "nestedProvider";
[ConfigurationProperty(type, IsRequired = true)]
public string Type
{
get
{
return (string)base[type];
}
}
[ConfigurationProperty(options, IsDefaultCollection = false, IsRequired = false)]
public GenericConfigurationElementCollection<StorageProviderOptionElement> Options
{
get
{
return (GenericConfigurationElementCollection<StorageProviderOptionElement>) this[options];
}
}
// this is what trigger stack overflow exception
[ConfigurationProperty(nestedProvider, IsDefaultCollection = false, IsRequired = false)]
public StorageProviderElement NestedProvider
{
get
{
return (StorageProviderElement)this[nestedProvider];
}
}
}
更新: 显示 StackOverflowException 难以调试的原因的屏幕截图。
【问题讨论】:
-
你自己造成了
StackOverflowException。查看调试器中的调用堆栈。 -
@PatrickHofman 不,我不是,看屏幕。
-
是的,你是...调用堆栈是什么?
-
可以添加调用栈吗?您是否调试过代码以查看代码是否按预期运行?
-
能否请您更具体/有帮助。什么可能在这里触发 StackOverflowException?我使用 C#,因为它是发明的并且可以区分异常:)
标签: c# web-config .net-4.5 stack-overflow app-config