如何使用方法参数属性

问题描述 投票:0回答:4

我一直在努力寻找如何编写自定义属性来验证方法参数的示例,即转变这种形式:

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);
        }
    }
}
c# .net decorator custom-attributes
4个回答
20
投票

您应用得正确 - 但属性基本上不知道它引用的成员。这肯定会让生活变得更加困难。

它不仅无法访问它所引用的成员,而且该成员将是

ParameterInfo
,而不是
Client
- 没有简单的方法可以从外部访问参数的 value。您的方法需要调用一些帮助程序代码,传递
client
的值以便正确处理它...或者您需要挂钩到将调用您的方法开始的代码,以便注意到属性。

尚不清楚您希望如何使用它,但很可能您需要显着改变您的设计。


5
投票

属性不足以做到这一点。

如果我理解正确,您想在参数上添加属性以便在运行时验证它,而这仅对于属性是不可能的。

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

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


1
投票

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


0
投票

十年过去了,这个自定义参数属性的用途仍然令人困惑...... 如果没有过于复杂的拦截,就无法管理它。

© www.soinside.com 2019 - 2024. All rights reserved.