我想知道如何编写可以访问函数的输入和输出参数的自定义属性。
以下是我希望实现的一个例子
[CustomAttribute("Creating Foo")]
public Foo CreateFoo(Foo newFoo)
{
//do logic
return newlyCreatedFoo;
}
由此,CustomAttribute
将在数据库中创建一个条目,其中包含" Creating Foo"标记,这很容易做到,但我希望能够同时访问newFoo
和newlyCreatedFoo
。这可能吗?
答案 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 /依赖注入库将您的类包装在一个代理对象中,该代理对象将拦截所有调用,并仅记录用特殊属性修饰的方法的值。