gpt4 book ai didi

c# - 条件属性 c#

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:16 24 4
gpt4 key购买 nike

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

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

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

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

正因为如此,我想让它对A OR B可见,只需要满足一个条件就可以查看。

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

由于程序的结构如何工作,它们必须是属性,所以我需要以这种或那种方式使用一个。我考虑过传入表示属性类名称的 strings,然后在 OrConditionAttribute 中从 string 名称创建该类的实例,但是我也不确定如何传递参数,因为 VisibleToAVisibleToB 都需要参数。

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

最佳答案

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

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

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

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 属性中的值。

关于c# - 条件属性 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49703705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com