Элемент конфигурации - комбинация атрибутов?

Скажи, что я определил обычай AdapterElement : ConfigurationElement со свойствами Type, Name а также Version, поскольку Name а также Version уникально идентифицирует Type свойство, я хотел бы заставить файл конфигурации иметь одну из следующих структур:

<adapter type="TypeOfAdapter"/>
<adapter name="NameOfAdapter" version="VersionOfAdapter"/>

Я мог бы легко пометить эти три свойства IsRequired = false и пусть пользователи определяют комбинацию, которую хотят. Однако следующие комбинации недопустимы, и я хотел бы запретить их:

<adapter type="TypeOfAdapter" version="VersionOfAdapter"/>
<adapter type="TypeOfAdapter" name="NameOfAdapter"/>

Есть ли простой способ добиться этого?

1 ответ

Решение

Мне пришлось немного почитать, чтобы найти ответы на этот вопрос.

Как насчет добавления проверки PostDeserialise на валидность в ваш класс AdapterElement?

protected override void PostDeserialize()
{
   bool isValid = Type != null && Name == null && Version == null
               || Type == null && Name != null && Version != null;
   if (!isValid)
   {
      throw new ArgumentException("Must specify either Type or Name and Version");
   }
   base.PostDeserialize();
}

Согласно блогу, который я обнаружил, нет более очевидного способа проверки правильности нескольких атрибутов в одном разделе конфигурации, но, похоже, это также верно для элементов конфигурации.

Другие вопросы по тегам