我一直在努力寻找如何编写自定义属性来验证方法参数的示例,即转换此表单:
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);
}
}
}
答案 0 :(得分:16)
您正确应用它 - 但属性基本上不知道它引用的成员。这绝对会让生活更加艰难。
它不仅无权访问其引用的成员,而且该成员将是ParameterInfo
,而不是Client
- 没有简单的方法来访问值< / em>外部参数。你的方法需要调用一些帮助代码,传递client
的值以便适当地处理它...或者你需要挂钩代码,它将调用你的方法开始,以便注意属性。
目前尚不清楚你究竟希望如何使用它,但很可能你需要更改你的设计。
答案 1 :(得分:2)
属性不足以做到这一点。
如果我理解正确,你想在参数上添加一个属性,以便在运行时验证它,而且只有属性才有可能。
这是不可能的,因为属性只是“元数据”而不是执行代码。
您需要一些“真实”代码才能阅读并采取相应措施。该代码可以在编译时注入,也可以挂钩到函数执行。
答案 2 :(得分:0)
属性可能应该放在方法本身上。当我在寻找解决方案时,我发现以下链接以及它使用拦截器的方式似乎更好http://www.codinginstinct.com/2008/05/argument-validation-using-attributes.html