有没有可能指定实现以下内容:
[SomeAttribute(condition1)]
public SomeType SomeSetting1 {get; set;}
[SomeAttribute(condition2)]
public SomeType SomeSetting2 {get; set;}
当 "condition" 是某些复杂的东西时,该怎么办?例如:
[SomeAttribute(SomeSetting3 == 4 && SomeSetting4 < 100)]
我正在使用 PropertyGrid
来显示/编辑配置作为可序列化类的属性。而且我需要有一种级联的方式:当设置某个值时,其他一些设置可能会被隐藏,这取决于该值。
目前,我可以通过以下方式隐藏某些设置:
- create new attribute, based on
IHide
- assign it to needed properties
check all attributes for a given property in
ConfigWrapper
, if there is any ofIHide
type, then check itsHide
to decide whenever show (add to result collection of properties) or not.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?
问题在于,存在多个不同的配置(从基本配置继承), 我希望能够在其中某些配置中自由指定可见性条件,这些条件将隐藏设置,而无需创建数十个基于IHide的属性。这是一种声明式编程,在定义设置本身时实现!
ICustomTypeDescriptor
,它仅为“PropertyGrid”创建所需属性的副本)实现了这一点。现在我需要的是条件属性来控制属性的可见性。类似于易于用作数百个属性的声明性属性的东西。 - Sinatr