自定义属性可以访问它正在装饰的方法的输入/输出参数

时间:2012-11-30 14:22:12

标签: c# custom-attributes

我想知道如何编写可以访问函数的输入和输出参数的自定义属性。

以下是我希望实现的一个例子

[CustomAttribute("Creating Foo")]
public Foo CreateFoo(Foo newFoo)
{
    //do logic
    return newlyCreatedFoo;
}

由此,CustomAttribute将在数据库中创建一个条目,其中包含" Creating Foo"标记,这很容易做到,但我希望能够同时访问newFoonewlyCreatedFoo。这可能吗?

3 个答案:

答案 0 :(得分:4)

自定义属性通常不能这样做:它们的目的是在反射过程中向方法添加元数据。

话虽如此,有些情况下利用属性来做到这一点。例如,ASP.Net MVC使用实现IAuthorizationFilter的自定义属性来为某些网页提供安全性。这是有效的,因为ASP首先使用反射来启动方法。一旦获得该方法,它就会检查是否有任何属性是IAuthorizationFilters,并在它们出现时做一些额外的工作。有关详细信息,请参阅this link

另一种思考方式是考虑aspect-oriented programming。我认为c#的AOP框架倾向于根据实现某个接口的属性对方法进行编译时装饰,但我还没有使用过。

我最喜欢的处理方式是良好的旧Proxy模式。创建一个日志代理。

答案 1 :(得分:1)

我担心使用自定义属性无法做到这一点。

这可以通过后期编译处理来实现。 PostSharp之类的工具可以让您实现此功能。

答案 2 :(得分:0)

也许您应该将您的问题改为“我如何拦截对特定方法的调用并记录参数”?

自定义属性只是方法的装饰。它不拦截或以任何方式影响方法的执行。它甚至不知道它附属于哪个成员。

如果要拦截调用,可以使用依赖注入框架或.NET的任何其他AOP框架来实现。其中一些实际上使用属性来标记其目标,但这不是必需的。

PostSharp只是.NET的一个AOP框架。

另一个选择是使用像MEF这样的IoC /依赖注入库将您的类包装在一个代理对象中,该代理对象将拦截所有调用,并仅记录用特殊属性修饰的方法的值。