0

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

以下是我希望实现的示例

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

由此,CustomAttribute将在数据库中创建一个带有“Creating Foo”标签的条目,这很容易做到,但我希望能够同时访问newFoo两者newlyCreatedFoo。这可能吗?

4

3 回答 3

4

自定义属性通常无法做到这一点:它们的目的是将元数据添加到方法中以在反射期间查看。

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

考虑这一点的另一种方法是考虑面向方面的编程。我认为 C# 的 AOP 框架倾向于根据实现某个接口的属性对方法进行编译时修饰,但我没有使用过。

我最喜欢的处理这个问题的方法是好的旧代理模式。创建日志记录代理。

于 2012-11-30T14:36:39.253 回答
1

恐怕这对于自定义属性是不可能的。

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

于 2012-11-30T14:24:08.570 回答
0

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

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

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

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

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

于 2012-11-30T14:39:22.660 回答