【问题标题】:C# Attribute or AttributeC# 属性或属性
【发布时间】:2012-04-18 14:45:36
【问题描述】:

我知道你可以像这样在 C# 中为方法添加属性,

ex1.

[HttpPost]
public void Method()
{
//code
}

这意味着必须满足属性才能运行Method()

而且我知道你可以像这样堆叠属性,

ex2.

[HttpPost]
[RequireHttps]
public void Method2()
{
 //More code
}

在您可以使用 Method2() 之前,它会检查属性 1 'AND' 属性 2 是否都满足。

但是你可以'或'属性吗?大概是这样的吧?

ex3.

[HttpPost || RequireHttps]
public void Method3()
{
  //Even more code
}

因此,如果满足任一属性,您可以使用Method3()

编辑:对不起,被称为注释的印象属性。解决了这个问题。

【问题讨论】:

  • 不,你不能。出于好奇,您的示例是学术性的,还是您想要完成的?
  • 那些不是注释。它们是属性。
  • 属性(即您作为注释发布的内容)只是额外的元数据。他们不强制执行任何事情
  • @mccow002 我试图完成这样的事情。我不够精明,无法故意问这个问题。 :p

标签: c# asp.net-mvc-3 attributes annotations custom-attributes


【解决方案1】:

这意味着必须满足注解才能运行 Method()

这是一个误解。

[HttpPost] 属性是一个指令,这个方法只会匹配一个 Post 请求。这不是像安全检查那样的“需求”。只有某些属性以这种方式起作用。

但是当将它们视为“要求”时:它们独立工作,因此总是会导致 AND 行为。

【讨论】:

  • 有趣的是,我的小组正在使用自定义属性来确保安全。而且我需要通过检查 2 个场景中的 1 个来注释该方法,或者找到一种不同的方法来限制对该方法的访问。想法?
  • 自定义属性,就像你说的那样......也许还有一个 PostSharp 让它更容易......当然,你总是可以在方法中做到这一点 - if (!Permission.Validate(user, Permisisons.DoSomething) ) 抛出新的 MyException(); - 一种东西
  • 当您编写自己的属性并使用例如字符串作为权限时,您可以创建[AuthorizeRequireOr("Admin", "Debugger")]
【解决方案2】:

在 C# 中,它们不称为注解,而是属性。
默认情况下,除了装饰类、方法、属性等之外,属性不用于任何用途。但是通过反射,您可以将它们用于您喜欢的任何事情,就像 ASP.NET MVC 对 HttpPostRequireHttps 所做的那样.

很遗憾,它们不能被 OR'ed。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多