Възможно ли е да се посочи постигане на следното:
[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