身份的开始和结束

时间:2015-09-16 13:21:21

标签: c# .net custom-attributes

我正在为方法创建Traces,并希望它与自定义属性一起使用。我将用TraceMethod装饰每个方法。

例如:

[TraceMethod()]
public void SomeMethod()
{
}

public class TraceMethod : Attribute
{
 public void StartTrace(){}

 public void EndTrace(){}
}

所以在这里,

如何在StartTrace()开始执行之前调用SomeMethod并在执行EndTrace()之后调用SomeMethod?有可能吗?

3 个答案:

答案 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() { ... }
}