如何使用方法参数属性

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

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); } } } 

您正确应用它 – 但属性基本上不知道它引用的成员。 这绝对会让生活更加艰难。

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

目前尚不清楚你究竟希望如何使用它,但很可能你需要大幅改变你的设计。

属性不足以做到这一点。

如果我理解正确,你想在参数上添加一个属性,以便在运行时validation它,而这只有属性才是不可能的。

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

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

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