Можно ли указать следующее:
[SomeAttribute(condition1)]
public SomeType SomeSetting1 {get; set;}
[SomeAttribute(condition2)]
public SomeType SomeSetting2 {get; set;}
где условие является чем-то сложным? К примеру,
[SomeAttribute(SomeSetting3 == 4 && SomeSetting4 < 100)]
Я использую PropertyGrid
для отображения/редактирования конфигурации как свойств некоторого сериализуемого класса. И мне нужно иметь что-то вроде каскада: когда один параметр установлен, некоторые другие могут быть скрыты, в зависимости от значения.
В настоящее время я могу скрыть некоторые настройки следующим образом:
- создать новый атрибут на основе
IHide
- назначьте его нужным свойствам
проверьте все атрибуты для данного свойства в
ConfigWrapper
, если есть какой-либо типIHide
, затем проверьте егоHide
, чтобы решить, когда показывать (добавлять в результирующий набор свойств) или нет.public interface IHide { bool Hide { get; } } public class AdminAttribute : Attribute, Common.IHide { public bool Hide { get { return !MySettings.Admin; } } public override object TypeId { get { return "AdminAttributeId"; } } } // admin only setting [Admin] public SomeType SomeSetting {get; set;}
Таким образом, я должен добавить новый атрибут для любого нового параметра (который должен скрывать некоторые другие параметры) или их комбинации (именно поэтому я хочу что-то более общее). Конечно, иногда я могу использовать параметр атрибута, чтобы иметь возможность использовать один атрибут для нескольких похожих целей:
public class ElementAttribute : Attribute, Common.IHide
{
private string _element;
public bool Hide
{
get { return !Something.Instance.IsElement(_element); }
}
public ElementAttribute(string element)
{
_element = element;
}
public override object TypeId { get { return "ElementAttributeId"; } }
}
Используя этот атрибут, я могу указать символ элемента:
// setting will be shown if element a present
[Element('a')]
public SomeType SomeSetting {get; set;}
После создания нескольких таких я пришел к мысли, что, возможно, можно как-то закодировать это условие метода Hide()
в самом параметре атрибута??? Или, возможно, как-то указать поведение (действие)?
Я могу довольно легко сделать это, используя CodeDom
я думаю, но это было бы очень медленно. Можно перечислить все атрибуты и условия кэширования. Но, может быть, есть более простой/альтернативный способ? Любые другие идеи?
Начальная награда
Я ищу идеи для объединения нескольких атрибутов IHide
(AdminAttribute
— показывать настройки, когда пользователь является администратором, ElementAttribute
— показывать настройки, когда присутствует указанный элемент и т. д.) в один супер-атрибут. Я хочу иметь возможность каким-то образом указывать условия без необходимости создавать новый атрибут на основе IHide
для каждого случая.
Каким было бы ваше решение, если вам нужно обрабатывать сотни настроек (которые существуют одновременно), но со связями между собой и дополнительно связанными на каких-то других условиях? Как создать поведение атрибутов Admin
и Element
, не создавая AdminAttribute
и ElementAttribute
?
Дело в том, что есть несколько разных конфигураций (унаследованных от базовой конфигурации) и я хочу иметь возможность в некоторых из них свободно задавать условия видимости частью кода, которая при оценке в false будет скрывать настройку, не создавая десятки атрибутов на основе IHide
. Что-то вроде декларативного программирования при определении самой настройки!
ICustomTypeDescriptor
, которая создает копию только необходимых свойств дляPropertyGrid
). Теперь мне нужен условный атрибут для управления видимостью свойств. Что-то, что можно легко использовать в качестве декларативного атрибута для сотен свойств. - person Sinatr   schedule 20.02.2014