3

app.configで、カスタムのネストされた構成コレクション用に独自のクラスのセットを作成しました。「認識されない属性'名前'。属性名では大文字と小文字が区別されることに注意してください。」というエラーが表示されます。

以下は、私のクラス、app.configの関連部分、およびカスタム構成を取得するためのコード行です。

public class Custom : ConfigurationSection
{
   [ConfigurationProperty("AutoSyncConfiguration")]
   public BackupLocationElementCollection AutoSyncConfiguration
   {
      get { return this["AutoSyncConfiguration"] as BackupLocationElementCollection; }
   }
}
public class BackupLocationElementCollection : ConfigurationElementCollection
{
   protected override ConfigurationElement CreateNewElement()
   {
      return new BackupLocationElement();
   }
   protected override object GetElementKey(ConfigurationElement element)
   {
      return ((BackupLocationElement)element).Name;
   }
   public override ConfigurationElementCollectionType CollectionType
   {
      get { return ConfigurationElementCollectionType.BasicMap; }
   }
   protected override string ElementName
   {
      get { return "BackupLocation"; }
   }
   public BackupLocationElement this[int index]
   {
      get { return (BackupLocationElement)BaseGet(index); }
      set
      {
         if (BaseGet(index) != null)
         {
            BaseRemoveAt(index);
         }
         BaseAdd(index, value);
      }
   }
   new public BackupLocationElement this[string backupName]
   {
      get { return (BackupLocationElement)BaseGet(backupName); }
   }
   public bool ContainsKey(string key)
   {
       bool result = false;
       object[] keys = BaseGetAllKeys();
       foreach (object obj in keys)
       {
         if ((string)obj == key)
         {
            result = true;
            break;
         }
      }
      return result;
   }
}

public class BackupLocationElement : ConfigurationElement
{
   [ConfigurationProperty("Name", IsRequired = true, IsKey = true)]
   public string Name
   {
      get { return this["Name"] as string; }
      set { this["Name"] = value; }
   } 

   [ConfigurationProperty("Details", IsRequired = true, IsKey = false)]
   public string Details
   {
      get { return this["Details"] as string; }
      set { this["Details"] = value; }
   } 

   [ConfigurationProperty("WatchedFolder")]
   public WatchedFolderElementCollection WatchedFolder
   {
      get { return this["WatchedFolder"] as WatchedFolderElementCollection; }
   }
} 

public class WatchedFolderElementCollection : ConfigurationElementCollection
{
   protected override ConfigurationElement CreateNewElement()
   {
      return new WatchedFolderElement();
   }
   protected override object GetElementKey(ConfigurationElement element)
   {
      return ((WatchedFolderElement)element).Name;
   }
   public override ConfigurationElementCollectionType CollectionType
   {
      get { return ConfigurationElementCollectionType.BasicMap; }
   }
   protected override string ElementName
   {
      get { return "WatchedFolder"; }
   }
   public WatchedFolderElement this[int index]
   {
      get { return (WatchedFolderElement)BaseGet(index); }
      set
      {
         if (BaseGet(index) != null)
         {
            BaseRemoveAt(index);
         }
         BaseAdd(index, value);
      }
   }
   new public WatchedFolderElement this[string folderName]
   {
      get { return (WatchedFolderElement)BaseGet(folderName); }
   }
   public bool ContainsKey(string key)
   {
      bool result = false;
      object[] keys = BaseGetAllKeys();
      foreach (object obj in keys)
      {
         if ((string)obj == key)
         {
            result = true;
            break;
         }
      }
      return result;
   }
} 

public class WatchedFolderElement : ConfigurationElement
{
   [ConfigurationProperty("Name", IsRequired = true, IsKey = true)]
   public string Name
   {
      get { return this["Name"] as string; }
      set { this["Name"] = value; }
   } 

   [ConfigurationProperty("LocalFolder", IsRequired = true, IsKey = false)]
   public string LocalFolder
   {
      get { return this["LocalFolder"] as string; }
      set { this["LocalFolder"] = value; }
   } 

   [ConfigurationProperty("RemoteFolder", IsRequired = true, IsKey = false)]
   public string RemoteFolder
   {
      get { return this["RemoteFolder"] as string; }
      set { this["RemoteFolder"] = value; }
   }

   [ConfigurationProperty("FileSpec", IsRequired = true, IsKey = false)]
   public string FileSpec
   {
      get { return this["FileSpec"] as string; }
      set { this["FileSpec"] = value; }
   }
}

以下は私のapp.configです。

<configuration>
  <configSections>
    <section name="custom" type="AutoSync.Custom, AutoSync" />
  </configSections>

  <custom>
    <AutoSyncConfiguration>
      <BackupLocation Name="S3" Details="AccessKey=asdf;SecretKey=asdf;BucketName=asdf">
        <WatchedFolder Name="test1" LocalFolder="C" RemoteFolder="Z" FileSpec="*"/>
      </BackupLocation>
      <BackupLocation Name="External" Details="MappedDrive=X;">
        <WatchedFolder Name="test" LocalFolder="D" RemoteFolder="XPhotos" FileSpec="*.jpeg" />
      </BackupLocation>
    </AutoSyncConfiguration>
  </custom>
</configuration>

そして私のコードは次のとおりです:

Custom config = (Custom)ConfigurationManager.GetSection("custom");

誰かが私のエラーがどこにあるかを見ることができますか?

4

1 に答える 1

3

私のクラスの書き方では、階層の一部を省略してしまったようです。以下を変更します。

[ConfigurationProperty("WatchedFolder")]
public WatchedFolderElementCollection WatchedFolder
{
   get { return this["WatchedFolder"] as WatchedFolderElementCollection; }
}

[ConfigurationProperty("WatchedFolders")]
public WatchedFolderElementCollection WatchedFolders
{
   get { return this["WatchedFolders"] as WatchedFolderElementCollection; }
}

そして、app.config を変更して、WatchedFolder 要素を囲む WatchedFolders 要素を作成すると、問題が修正されました。

于 2013-02-05T16:29:51.890 に答える