如何使用方法参数属性
本文关键字:属性 参数 使用方法 | 更新日期: 2023-09-27 18:18:56
我一直在努力寻找如何编写自定义属性来验证方法参数的示例,即,转换此形式:
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
的值以便适当地处理它……或者你需要钩入将要调用你的方法的代码,以便注意到属性。
不清楚您希望如何使用它,但很可能需要对您的设计进行重大更改。
仅靠属性是不够的。
如果我理解正确的话,您想在参数上添加属性以便在运行时验证它,而这只有使用属性是不可能的。
这是不可能的,因为属性只是"元数据",而不是可执行的代码。
你将需要一些"真正的"代码来阅读它并采取相应的行动。该代码可以在编译时注入,也可以挂接到函数执行中。
属性可能应该放在方法本身。当我在寻找解决方案时,我发现了以下链接,它使用拦截器的方式似乎更好http://www.codinginstinct.com/2008/05/argument-validation-using-attributes.html