【问题标题】:Conditional Attributes c#条件属性 c#
【发布时间】:2018-09-17 03:01:43
【问题描述】:

在我的程序中,我有两个属性:VisibleToAVisibleToB。这些用于通过 API 限制某些函数的可见性。

当我需要让AB 可见的功能时,就会出现问题。默认情况下,属性是“与”在一起的,因此我创建了一个方法:

[VisibleToA(), VisibleToB()]
public void ConditionallyVisibleMethod() { }

它实际上等同于VisibleToAandB。这是一个问题,因为如果它们都为真,那么A 就无法看到它,因为A 不是B,并且使得B 无法看到它,因为B不是A

因此,我想让它对AB 可见,只需要满足一个条件即可查看。

所以,简单的修复,我创建了一个OrConditionAttribute,它接收Attributes 的数组。循环遍历每个条件,如果为真,则返回真。然后我发现属性只能有原始类型的参数,因为它们是如何写入元数据的。

由于程序的结构如何工作,它们必须是属性,所以我需要以一种或另一种方式使用一种。我考虑过传入代表属性的类名的strings,然后在OrConditionAttribute 中从string 名称创建一个类的实例,但我不知道如何传入参数,因为@987654341 @ 和 VisibleToB 都需要参数。

有没有办法实现这个功能?

【问题讨论】:

  • 您的问题有点难以回答,因为有一些关于您的限制的重要细节无法解释,特别是您所说的“由于程序的结构如何工作”是什么意思。您是否使用其他人编写的属性类?还是您正在设计自己的系统?这将有助于找到答案。
  • 如果这些是您的属性,那么肯定取决于您如何处理它们,因此如果您希望它们 ORed,那么您应该如何处理它们。也许我忽略了一些东西。
  • 我的程序正在使用依赖于属性的 API。每个类和函数(甚至一些参数)都使用它们,我必须用所述属性标记我的代码,以便它们可以与 API 通信。我同意这有点奇怪,但一旦你习惯了它就会有意义。
  • 这个 API 是公开的吗?链接到它可能会有所帮助,以便我们为您找到答案。
  • 是的,这是我试图扩展的属性以使 OrCondition discord.foxbot.me/stable/api/… 我的两个属性属于不同的组。

标签: c# attributes conditional-statements


【解决方案1】:

不幸的是,要直接回答您的问题,无法(以声明方式)有条件地将两个属性应用于您的类/方法/属性,它们要么被应用,要么不被应用,所以在你的情况下,你有两个VisibleToAVisibleToB。提供给属性构造函数的值也必须是编译时常量,这可能也是您的问题的一部分。

就您的设计而言,在我看来,您的属性类本身有一些业务逻辑,这可能会导致您的问题。限制属性中包含的实际逻辑的数量通常是一种很好的设计实践,而是有一些其他机制来解释您已应用于类/方法/属性的元数据。

如果你可以改变你的设计,我建议如下:

public enum VisibilitySpecifier
{
    A,
    B,
}

public class AndVisibleToAttribute : Attribute
{
    public VisibilitySpecifier[] Visibility { get; set; }

    public AndVisibleToAttribute(params VisibilitySpecifier[] visibility)
    {
        Visibility = visibility;
    }
}

public class OrVisibleToAttribute : Attribute
{
    public VisibilitySpecifier[] Visibility { get; set; }

    public OrVisibleToAttribute(params VisibilitySpecifier[] visibility)
    {
        Visibility = visibility;
    }
}

然后,只需根据所选特定属性定义的逻辑处理 Visibility 属性中的值。

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2018-05-03
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多