gpt4 book ai didi

.net - 在抽象 Attribute 类上指示 AllowMultiple=false 有什么意义?

转载 作者:行者123 更新时间:2023-12-03 14:58:49 26 4
gpt4 key购买 nike

在最近的 question关于 MVC 属性,有人询问在操作方法上使用 HttpPost 和 HttpDelete 属性是否会导致请求类型被允许或不允许请求(因为它不能同时是 Post 和 Delete)。我注意到 HttpPostAttribute 和 HttpDeleteAttribute 都从中派生的 ActionMethodSelectorAttribute 装饰有

[AttributeUsage(AttributeTargets.Method,
AllowMultiple = false,
Inherited = true)]

因此,我曾期望它不允许在同一方法上同时使用 HttpPost 和 HttpDelete,但编译器不会提示。我有限的测试告诉我,基类上的属性使用被简单地忽略了。 AllowMultiple 似乎只禁止 中的两个相同属性被应用于方法/类,并且似乎没有考虑这些属性是否来自配置为不允许多个属性的同一类。此外,基类的属性用法甚至不妨碍您更改派生类的属性用法。既然如此,那么即使在基本属性类上设置值又有什么意义呢?它只是建议性的,还是我错过了它们工作方式的基本内容?

仅供引用 - 事实证明,使用这两种方法基本上排除了该方法的考虑。属性是独立评估的,其中一个将始终指示该方法对请求无效,因为它不能同时是 Post 和 Delete。

最佳答案

设置AllowMultiple on a base 属性本质上为从它派生的所有属性设置默认值。如果您希望从基本属性派生的所有属性都允许多个实例,那么您可以通过应用 [AttributeUsage] 来保存重复。将此效果归因于基本属性,从而避免对所有派生属性执行相同操作。

例如,假设您想允许这样做:

public abstract class MyAttributeBase : Attribute
{
}

public sealed class FooAttribute : MyAttributeBase
{
}

public sealed class BarAttribute : MyAttributeBase
{
}

[Foo]
[Foo]
[Bar]
[Bar]
public class A
{
}

就目前而言,这会产生编译器错误,因为默认情况下自定义属性不允许多个实例。现在,您可以申请 [AttribteUsage]两个 [Foo][Bar]像这样:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public sealed class FooAttribute : MyAttributeBase
{
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public sealed class BarAttribute : MyAttributeBase
{
}

但或者,您可以改为将其应用于基本属性:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public abstract class MyAttributeBase : Attribute
{
}

public sealed class FooAttribute : MyAttributeBase
{
}

public sealed class BarAttribute : MyAttributeBase
{
}

两种方法具有相同的直接效果( [Foo][Bar] 的多个实例是允许的),但第二种方法也具有间接效果,即源自 [MyAttribute] 的任何其他属性。现在将允许多个实例,除非它们有自己的 [AttributeUsage]覆盖该设置。

关于.net - 在抽象 Attribute 类上指示 AllowMultiple=false 有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2649081/

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