【问题标题】:How to use method parameter attributes如何使用方法参数属性
【发布时间】:2013-06-13 13:47:49
【问题描述】:

我一直在努力寻找如何编写自定义属性来验证方法参数的示例,即,转换此表单:

public void DoSomething(Client client)
{
    if (client.HasAction("do_something"))
    {
        // ...
    }
    else
    {
        throw new RequiredActionException(client, "do_something");
    }
}

进入这个:

public void DoSomething([RequiredAction(Action="some_action")] Client client)
{
    // ...
}

据我所知,我需要将此属性添加到我的自定义属性中,但我不知道如何访问装饰参数Client

[AttributeUsageAttribute(AttributeTargets.Parameter)]
public class RequireActionAttribute : System.Attribute
{
    public Type Action {get; set;}

    public RequireActionAttribute()
    {
        // .. How do you access the decorated parameter?
        Client client = ???

        if (!client.HasAction(Action))
        {
            throw new RequiredActionException(client, Action);
        }
    }
}

【问题讨论】:

  • 为什么不能简单地接受一个接口作为参数?例如,您可以有一个IDoSomething
  • 您无法从属性内部访问装饰项目。属性静态地针对类型元数据,因此您实际上是从项目中获取属性。也就是说,该属性可以有一个方法,该方法接受一个作为项目的参数,但是您正在使用大锤来敲击核桃,如果没有属性,本可以更容易做到。

标签: c# .net decorator custom-attributes


【解决方案1】:

您正确地应用了它 - 但属性基本上不知道它所指的成员。这肯定会让生活变得更加艰难。

它不仅无法访问它所引用的成员,而且该成员将是 ParameterInfo,而不是 Client - 没有简单的方法可以访问 外部参数。您的方法需要调用一些帮助代码,传递 client 的值以便适当地处理它......或者您需要挂钩到将调用您的方法开始的代码,以便注意到属性。

目前尚不清楚您希望如何使用它,但很可能您需要对设计进行重大更改。

【讨论】:

    【解决方案2】:

    属性是不够的。

    如果我理解正确,您想在参数上添加一个属性以便在运行时对其进行验证,而仅使用属性是不可能的。

    这是不可能的,因为属性只是“元数据”而不是执行代码。

    您将需要一些“真实”的代码来阅读它并采取相应的行动。该代码可以在编译时注入,也可以挂接到函数执行中。

    【讨论】:

      【解决方案3】:

      属性可能应该放在方法本身上。当我在寻找解决方案时,我发现了以下链接,它使用拦截器的方式似乎更好http://www.codinginstinct.com/2008/05/argument-validation-using-attributes.html

      【讨论】:

      • 你能再解释一下吗?
      • 我可能误解了原始代码。我发布的链接使用拦截器来验证代码。评论不允许我从那里发布代码。在我看来,这个解决方案看起来比我们过去所做的属性验证更优雅。
      猜你喜欢
      • 2016-08-05
      • 1970-01-01
      • 2017-08-08
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 2012-04-29
      相关资源
      最近更新 更多