【发布时间】: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