是否可以创建一个自定义功能来捕获由自定义属性设置的方法中的异常?
我打算做这样的事情:[Logging(FeatureEnum.SomeFeature, IntentEnum.SomeIntent, "some comment")]
public void SomeMethodThatDoesATask()
{
try
{
var doSomeAction = new LazyProcess();
doSomeAction.WhoDunnit();
}
catch(Exception ex)
{
StaticMethodThatDoesLogging.CatchError(ex);
}
}
问题是: 如何捕获放置此属性的方法名称以及抛出的事件?它可以捕获异常,也可以自动记录调用此方法。
答案 0 :(得分:5)
这不容易实现。例如,TypeMock使用.NET框架分析器API来监视应用程序的执行。它允许您注册不同的事件,并在调用方法时发出通知,发生异常,......但这不是一件容易的事。
另一方面,您可以使用AOP,但它需要您修改代码,以便调用者使用一些生成的代理而不是真正的类。 Spring.NET有一些不错的功能。
所以基本上没有使用.NET框架Profiler API或者没有编写一些使用反射从给定类中读取这些属性的自定义代码,您无法实现这一点。属性只是类元数据,没有能够理解它们的东西,它们什么都不做。
答案 1 :(得分:1)
看看
http://www.dcl.hpi.uni-potsdam.de/research/loom/rapier_loom.htm
http://www.dcl.hpi.uni-potsdam.de/research/loom/gripper_loom.htm
首先是运行时编织器,而第二个是静态编织器。
这些是另一个很好的资源:
http://ayende.com/Blog/archive/2007/07/02/7-Approaches-for-AOP-in-.Net.aspx
http://msdn.microsoft.com/en-us/magazine/cc301356.aspx
http://www.codeproject.com/KB/architecture/AOP_Injection_IL.aspx
答案 2 :(得分:1)
属性只是元数据。您需要使用类似PostSharp的代码进行代码编织,或使用运行时拦截库(如Castle.DynamicProxy)。除了通过反射之外,属性本身不包含应用程序的实际功能。
如果在执行日志记录的方法中有一行代码,则可以获取调用方法的堆栈框架,使用反射来检查属性,然后从那里开始。我假设这是你想用StaticMethodThatDoesLogging做的。
public void CatchError(Exception ex)
{
StackFrame parentFrame = new StackFrame(1);
MethodBase mi = parentFrame.GetMethod();
LoggingAttribute attr = mi.GetCustomAttributes(typeof(LoggingAttribute), true).FirstOrDefault() as LoggingAttribute;
if (attr != null)
{
// do your logging.
}
}