在我的计划中,我有两个属性:VisibleToA
和VisibleToB
。这些用于通过API限制某些功能的可见性。
当我需要A
或B
可见某个功能时,会出现问题。默认情况下,属性“一起”,以便我创建一个方法:
[VisibleToA(), VisibleToB()]
public void ConditionallyVisibleMethod() { }
它实际上等同于VisibleToAandB
。这是一个问题,因为如果它们都是真的,那么A
就无法看到它,因为A
不是B
,并且B
无法实现要看到它,因为B
不是A
。
因此,我想让A
或B
看到它,只需要满足一个条件才能查看它。
所以,简单的修复,我创建了一个OrConditionAttribute
,其中包含Attributes
数组。循环遍历每个条件,如果为true,则返回true。然后我发现属性只能由于它们在元数据中的写入方式而具有基本类型的参数。
由于程序的结构如何工作,它们必须是属性,因此我需要使用一种或另一种方式。我考虑过传递strings
表示属性的类名,然后在OrConditionAttribute
里面从string
名称创建一个类的实例,但我不知道如何传入参数以及VisibleToA
和VisibleToB
都需要参数。
有没有办法实现这个功能?
答案 0 :(得分:0)
为了直接回答你的问题,遗憾的是,没有办法(声明性地)有条件地将两个属性应用于你的类/方法/属性,它们是否应用,所以在你的情况下,你同时拥有{{1} } 和 VisibleToA
。提供给属性构造函数的值也必须是编译时常量,这可能也是您问题的一部分。
就您的设计而言,听起来就像您在属性类本身中拥有一定数量的业务逻辑,这可能会导致您的问题。限制属性中包含的实际逻辑的数量通常是良好的设计实践,而是有一些其他机制来解释您已应用于类/方法/属性的元数据。
如果你可以改变你的设计,我建议如下:
VisibleToB
然后,只需根据所选特定属性定义的逻辑处理Visibility属性中的值。