我试图编写一个自定义属性,我可以应用于方法,以防止在Transaction.Current
为空时调用该方法。我目前有一个基本属性类,如果该项为null,则抛出异常。这是:
[AttributeUsage(AttributeTargets.Method)]
public class RequiresTransactionAttribute : System.Attribute
{
public RequiresTransactionAttribute()
{
if (Transaction.Current == null)
{
throw new Exception("requires transaction");
}
}
}
问题是这不会导致我的测试中的方法调用失败。
我已经读过这些属性被转换为元数据,所以这个构造函数永远不会被执行,因为它被优化了,除非我专门使用反射来导致属性被执行。
是否可以根据我的使用属性方法或者其他更好的方法来阻止方法被调用?
答案 0 :(得分:3)
使用非常少的异常(运行时具有内置行为的属性,JIT正在寻找它们 - 如[MethodImpl(...)]
或代码访问 - 安全属性),属性为完全惰性 - 它们纯粹作为元数据存在。它们甚至不被实例化为对象,除非您使用反射来要求它这样做。
所以不是:你不能像那样影响运行时行为,除非你正在使用一个偏离的框架来寻找属性,实例化它们,以及通过框架本身检查的方法将它们视为可运行的代码。 ASP.NET MVC将是一个执行此操作的框架示例。
另一个选项是IL重写器,例如post-sharp,其中属性是在编织期间注入额外代码的流行钩子。