我正在为方法创建Traces,并希望它与自定义属性一起使用。我将用TraceMethod
装饰每个方法。
例如:
[TraceMethod()]
public void SomeMethod()
{
}
public class TraceMethod : Attribute
{
public void StartTrace(){}
public void EndTrace(){}
}
所以在这里,
如何在StartTrace()
开始执行之前调用SomeMethod
并在执行EndTrace()
之后调用SomeMethod
?有可能吗?
答案 0 :(得分:2)
您要做的是Aspect-Oriented Programming,这在.NET世界中目前不支持开箱即用。您将不得不使用第三方组件; there are some out there,付费和开源。
答案 1 :(得分:0)
也许创建一个标记函数范围的自定义类?在函数开头创建类的实例,当函数终止时,类超出范围并调用析构函数。
构造函数和析构函数标记函数的开头和结尾。
编辑:
如评论所述,在对象超出范围之后立即调用析构函数是不可取的。更好的是使用using()
块:
public void SomeMethod()
{
using (TraceMethod trace = new TraceMethod())
{
}
}
public class TraceMethod : IDisposable
{
public TraceMethod() { StartTrace(); } // Constructor
public void Dispose() { EndTrace(); } // Gets called when leaving the using() block
private void StartTrace() { ... }
private void EndTrace() { ... }
}
答案 2 :(得分:0)
你可以修改方法体:
public void SomeMethod()
{
var trace = new Trace();
try
{
... rest of method
}
finally
{
trace.EndTrace();
}
}
public class TraceMethod : Attribute
{
public TraceMethod() => StartTrace();
public void StartTrace() { ... }
public void EndTrace() { ... }
}