1

从多种来源(包括stackOverlflow)花絮,但是当我来使用它,我得到以下错误消息实现自定义配置节处理程序

“的配置属性‘DeviceConfig软件’可以不被自ConfigurationSection衍生“。

我一直在为这一天的大部分时间而苦苦挣扎,而且我也没有接近解决方案,所以对此事的任何帮助都将不胜感激。我在实现自定义配置部分是新手,所以请温柔地对待我:-)

App.config文件看起来是这样的:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="deviceconfig" type="CNIMonitor.Core.CustomConfig.DeviceConfig,Core"/> 
    </configSections> 
<system.diagnostics> 
    <sources> 
     <!-- This section defines the logging configuration for My.Application.Log --> 
     <source name="DefaultSource" switchName="DefaultSwitch"> 
      <listeners> 
       <add name="FileLog"/> 
       <!-- Uncomment the below section to write to the Application Event Log --> 
       <!--<add name="EventLog"/>--> 
      </listeners> 
     </source> 
    </sources> 
    <switches> 
     <add name="DefaultSwitch" value="Information" /> 
    </switches> 
    <sharedListeners> 
     <add name="FileLog" 
      type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" 
      initializeData="FileLogWriter"/> 
     <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log --> 
     <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> --> 
    </sharedListeners> 
</system.diagnostics> 
<deviceconfig> 
    <devices>   
     <device deviceid = "1" 
       name = "localhost" 
       ipaddress="127.0.0.1" 
       port="10000" 
       status="not listening" 
       message="no message" 
     /> 
     <device deviceid ="2" 
       name ="2nd localhost" 
       ipaddress="127.0.0.1" 
       port="20000" 
       status="not listening" 
       message="no message" 
     /> 
    </devices> 
</deviceconfig> 

自定义节处理程序代码如下:

Imports System.Configuration 

命名空间CNIMonitor.Core.CustomConfig

Public Class DeviceConfig 
    Inherits ConfigurationSection 
    <ConfigurationProperty("deviceconfig")> _ 
    Public ReadOnly Property DeviceConfig() As DeviceConfig 
     Get 
      Return CType(MyBase.Item("deviceconfig"), DeviceConfig) 
     End Get 
    End Property 
End Class 

<ConfigurationCollectionAttribute(GetType(Device))> _ 
Public Class Devices 
    Inherits ConfigurationElementCollection 
    Protected Overrides Function CreateNewElement() As ConfigurationElement 
     Return New Device 
    End Function 
    Protected Overrides Function GetElementKey _ 
    (ByVal element As ConfigurationElement) As Object 
     Return CType(element, Device).DeviceID 
    End Function 
    Public Sub Add(ByVal element As Device) 
     Me.BaseAdd(element) 
    End Sub 
End Class 
Public Class Device 
    Inherits ConfigurationElement 
    <ConfigurationProperty("deviceid", DefaultValue:="", IsKey:=True, IsRequired:=True)> _ 
    Public Property DeviceID() As String 
     Get 
      Return CType(MyBase.Item("deviceid"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("deviceid") = value 
     End Set 
    End Property 
    <ConfigurationProperty("hostname", DefaultValue:="", IsKey:=True, IsRequired:=False)> _ 
    Public Property HostName() As String 
     Get 
      Return CType(MyBase.Item("RegisteredDate"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("RegisteredDate") = value 
     End Set 
    End Property 
    <ConfigurationProperty("ipaddress", DefaultValue:="", IsKey:=True, IsRequired:=False)> _ 
    Public Property IpAddress() As String 
     Get 
      Return CType(MyBase.Item("ipaddress"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("ipaddress") = value 
     End Set 
    End Property 
    <ConfigurationProperty("port", DefaultValue:="", IsKey:=True, IsRequired:=False)> _ 
    Public Property Port() As String 
     Get 
      Return CType(MyBase.Item("port"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("port") = value 
     End Set 
    End Property 
    <ConfigurationProperty("status", DefaultValue:="", IsKey:=False, IsRequired:=False)> _ 
    Public Property Status() As String 
     Get 
      Return CType(MyBase.Item("status"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("status") = value 
     End Set 
    End Property 
    <ConfigurationProperty("message", DefaultValue:="", IsKey:=False, IsRequired:=False)> _ 
    Public Property Message() As String 
     Get 
      Return CType(MyBase.Item("message"), String) 
     End Get 
     Set(ByVal value As String) 
      MyBase.Item("message") = value 
     End Set 
    End Property 
End Class 

End Namespace 

回答

1

顶层不需要DeviceConfig属性。 需要做的是为您的ConfigurationElementCollection设备添加一个属性。我还会将你的Devices类重命名为不太模糊的东西,比如DeviceElementCollection。试试这个:

Public Class DeviceConfig  
    Inherits ConfigurationSection  

    <ConfigurationProperty("Devices")> _  
    Public ReadOnly Property Devices() As DeviceElementCollection  
     Get  
      Return CType(Me("Devices"), DeviceElementCollection)  
     End Get  
    End Property  
End Class  

然后,在你定义DeviceElementCollection,你可能有问题,如果不添加以下内容:

Public Overrides ReadOnly Property CollectionType() As System.Configuration.ConfigurationElementCollectionType 
    Get 
     Return ConfigurationElementCollectionType.BasicMap 
    End Get 
End Property 

Protected Overrides ReadOnly Property ElementName() As String 
    Get 
     Return "Device" 
    End Get 
End Property 

我写了一个很长的回答类似的问题(对不起,在C#)here

更新 - 如何在代码中使用

Dim deviceConfiguration as DeviceConfig = ConfigurationManager.GetSection("deviceconfigs") 
For Each device As Device in deviceConfiguration.Devices 
    '...whatever you need to do 
Next 
+0

AJ感谢您的repsonse,已经改变了我的代码按你的建议,现在该代码编译,但我在一个不知如何使用来自应用程序内的部分处理程序。你有什么建议吗?我需要找到一个方法来遍历配置文件中指定的元素集合。 – 2010-11-03 10:11:10

+0

查看我的使用更新。 – 2010-11-03 15:29:28

+0

有点深入的调查得到它的工作 – 2010-11-03 16:57:01

相关问题