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

本文关键字:调用 方法 MyMethod 一种 | 更新日期: 2023-09-27 18:27:49

我以前问过这个问题,但我没有很好地解释,所以我又来了。。。

我有一个类似的课程

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;
    }
}

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

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

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

您可以使用AOP来实现。

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

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

是的,您可以编写一个函数来进行设置和拆卸,并将"something different"作为参数。

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程序员一直在使用这种技术。