Ros*_*oss 10 .net c# decorator custom-attributes
我一直在努力寻找如何编写自定义属性来验证方法参数的示例,即转换此表单:
public void DoSomething(Client client)
{
if (client.HasAction("do_something"))
{
// ...
}
else
{
throw new RequiredActionException(client, "do_something");
}
}
Run Code Online (Sandbox Code Playgroud)
进入这个:
public void DoSomething([RequiredAction(Action="some_action")] Client client)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我需要将此属性添加到我的自定义属性,但我对如何访问修饰参数感到茫然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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 17
你正确地应用它 - 但是一个属性基本上不知道它引用的成员.这绝对会让生活更加艰难.
它不仅无法访问它所引用的成员,而且该成员将是a ParameterInfo,而不是Client- 没有简单的方法可以从外部访问参数的值.你的方法需要调用一些帮助代码,传递值client以便适当地处理它......或者你需要挂钩代码来调用你的方法开始,以便注意属性.
目前尚不清楚你究竟希望如何使用它,但很可能你需要显着改变你的设计.
属性是不够的。
如果我理解正确,您想在参数上添加一个属性以便在运行时对其进行验证,而这仅使用属性是不可能的。
这是不可能的,因为属性只是“元数据”而不是执行的代码。
您将需要一些“真正的”代码来阅读它并采取相应的行动。该代码可以在编译时注入,也可以挂接到函数执行中。
| 归档时间: |
|
| 查看次数: |
20179 次 |
| 最近记录: |