C# Вложенная настраиваемая конфигурация: альтернативные типы элементов в коллекциях элементов - PullRequest
0 голосов
/ 26 марта 2020

Извините, я новичок в конфигурационных файлах и xml.

Этот пример близок к тому, что я хочу: Правильно ли реализован пользовательский раздел конфигурации с вложенными коллекциями? (state-county-example). К сожалению, код, отображаемый там, показывает множество cs-файлов в целом. Пожалуйста, не вините меня в этом.

Однако , я не нашел пример, используя конфигурационный файл, как показано ниже - где (в моем случае) элемент ExpectedColums может ЛИБО включать в себя столбцы, содержащие перечисление ИЛИ, содержащие только любой текст с необязательным префиксом-текстом.

Пример: Предположим, что у нас есть какая-то таблица и мы хотим настроить связанную parser.

<?xml version="1.0" encoding="utf-8" ?>
<TableParserConfig>
   <ExpectedColumns>
      <Column title="ID" type="string" isKeyColumn="Yes" isMandatory="Yes"/>
         <Prefix text="any prefix">
      </Column>
      <Column title="She likes me" type="string" isKeyColumn="No" isMandatory="Yes"/>
         <SingleState state="Undefined">
         <SingleState state="No"> 
         <SingleState state="Yes">
      </Column>  
   </ExpectedColumns>
</TableParserConfig>

То, что я пробовал: Близко к примеру, на который ссылается приведенная выше ссылка. Но я реализовал абстрактный базовый класс и использовал их дочерние элементы для различия между Prefix элементами и SingleState элементами - оба наследуются от класса ConfigurationElement .

Итак, классы кода ниже являются аналоговыми классами usaStateDefinitionConfigElement кода, на который ссылается ссылка выше.

Чего я не понимаю: Мне интересно как между двумя детьми можно различить по отражению, если оба получают один и тот же текст в виде строки через 1-й параметр атрибута?

Мои вопросы:

  • Является ли такой "случай ИЛИ" возможен в файле конфигурации?
    • Если "да", как реализовать связанный код позади?
      • См. Выше "Что я не понимаю".
    • Если "нет", как получить вариант "или", легкий для понимания (в лучшем случае случай самоочевидный) для программиста, конфигурирующего без больших знаний о коде позади?
  • Относительно топи c: есть ли общее или существенное различие между «возможными макетами» в xml по сравнению с конфиг-файлами?
    • Если да, то нужно ли мне обходиться путем использования xml -файлов? (используя другое пространство имен)

Часть моей реализации:

using System.Configuration

namespace MyTableExample
{
   public class SingleStateConfigElement : AbstractConfigElement
   {
      private const string _columnPropertyName = "ExpectedCollumns";

      [ConfigurationProperty(_columnPropertyName, IsDefaultCollection = false)]
      public override AbstractConfigElement ExpectedColumn 
      {
         get { return (SingleStateConfigElement)base[_columnPropertyName]; }
         set { this[_columnPropertyName] = value; }
      }
   }

   public class CommonContentConfigElement : AbstractConfigElement
   {
      private const string _columnPropertyName = "ExpectedCollumns";

      [ConfigurationProperty(_columnPropertyName, IsDefaultCollection = false)]
      public override AbstractConfigElement ExpectedColumn 
      {
         get { return (CommonContentConfigElement)base[_columnPropertyName]; }
         set { this[_columnPropertyName] = value; }
      }
   }

   public abstract class AbstractConfigElement : ConfigElement
   {
      ...
      private const string _isMandatory = "isMandatory";
      ...

      [ConfigurationProperty(_isMandatory, IsRequired = false)]
      public bool IsMandatory
      {
         get { return (bool)base[_isMandatory]; }
         set { this[_isMandatory] = value; }
      }

      public abstracte AbstractConfigElement ExpectedColumn { get; set;}

   }
}
...