一种在C#中调用MyMethod之前和之后调用方法的方法

时间:2015-12-23 16:01:01

标签: c#

之前我曾问过这个问题,但我没有做好解释,所以我又去了......

我有类似这样的课程

public class BaseClass {
    public void Setup() { Do something... }
    public void TearDown() { Do something else...}
{

public class SubClass : BaseClass {

    public Object1 Method1(Object2 o2) {
        Setup();
        Do something specific to this method...
        TearDown();
        return object1;
    }

    public Object3 Method2(Object4 o4, Object5 o5) {
        Setup();
        Do something different here...
        TearDown();
        return object3;
    }
}

还有其他类扩展BaseClass,这些类中的方法也必须以类似的方式运行Setup和TearDown。

我想要做的就是不必为我创建的每个方法调用Setup和TearDown。我想简单地做这样的事情:

public class BaseClass {
    [RunBeforeEveryMethod]
    public void Setup() { Do something... }
    [RunAfterEveryMethod]
    public void TearDown() { Do something else...}
{

public class SubClass : BaseClass {

    public Object1 Method1(Object2 o2) {
        Do something specific to this method...
        return object1;
    }

    public Object3 Method2(Object4 o4, Object5 o5) {
        Do something different here...
        return object3;
    }
}

我发现其他类似thisthis的帖子。但我的情况有点不同,因为:

  1. 我必须在之前和之后调用一种方法。
  2. 我在子类中也有多个具有不同方法名称的方法,其中每个方法都必须调用这些设置和拆除。
  3. 参数可以是任何数字。

2 个答案:

答案 0 :(得分:2)

您可以使用AOP来完成。

我建议您查看在运行时执行此操作的文章http://www.codeproject.com/Articles/8436/Intercepting-method-calls-in-C-an-approach-to-AOSD

你也可以使用像PostSharp或Fody这样的IL编织。

答案 1 :(得分:1)

是的,您可以编写一个功能来完成您的设置和拆卸,并采取不同的方式。作为参数。

protected T Wrapper<T>(Func<T> something)
{
    Setup();

    try
    {
        return something();
    }
    finally
    {
        Teardown();
    }
}

与lambda函数一起,您现在可以安全地完成任务:

public Object1 Method1(Object2 o2) 
{
    return Wrapper<Object1>(() => 
    {
       Do something specific to this method...
       return object1;
    });
}

public Object3 Method2(Object4 o4, Object5 o5) 
{
    return Wrapper<Object3>(() => 
    {
       Do something different here...
       return object3;
    });
}

这种技术一直被JavaScript程序员使用。