C# 在.NET中,有没有一种方法可以在调用另一个方法后但在输入之前自动调用该方法

C# 在.NET中,有没有一种方法可以在调用另一个方法后但在输入之前自动调用该方法,c#,.net,C#,.net,我要寻找的是一种在调用另一个方法之后但在输入之前调用该方法的方法。例如: public class Test { public void Tracer ( ... ) { } public int SomeFunction( string str ) { return 0; } public void TestFun() { SomeFunction( "" ); } } 在上面的示例中,我希望在TestFun()调用SomeFunc

我要寻找的是一种在调用另一个方法之后但在输入之前调用该方法的方法。例如:

public class Test {

  public void Tracer ( ... )
  {
  }

  public int SomeFunction( string str )
  {
    return 0;
  }

  public void TestFun()
  {
    SomeFunction( "" );
  }

}
在上面的示例中,我希望在TestFun()调用SomeFunction()之后但在输入SomeFunction()之前调用Tracer()。我还想获取SomeFunction()上的反射数据


我发现每个人的答案都很有趣。这个问题的最佳答案是使用Castle的DynamicProxy;然而,我不会用它来解决我的问题,因为它需要在我的项目中添加一个库。我只需要“跟踪”几个方法,所以我选择了一种修改过的“核心”方法,并结合了动态代理的实现方式。我在下面回答我自己的问题时解释了这一点

请注意,我将研究其他一些应用程序的AOP和ContextBoundObject类。

使用*Core方法:

public int SomeFunction(string str)
{
    Tracer();
    return SomeFunctionCore(str);
}

private int SomeFunctionCore(string str)
{
    return 0;
}

许多.NET API都使用这种方法(WPF中有很多这样做)。

您可以使用动态代理(例如)来拦截调用,运行任何您想要的代码,然后根据需要调用或不调用您的方法。

您想研究面向方面的编程吗。这是我在.NET中为AOP找到的一个页面:


面向方面编程涉及从代码中分离出“横切关注点”。其中一个例子是日志记录——日志记录(希望)存在于您的所有代码中。这些方法真的需要了解日志记录吗?也许不是。AOP研究的是将这些关注点从它们处理的代码中分离出来,并在编译时或运行时将它们重新注入。我发布的链接包含指向几个工具的链接,这些工具可用于编译时和运行时AOP。

您必须使用某种形式的AOP框架才能做到这一点。

.NET有一个名为ContextBoundObject的类,只要您不介意从基类派生,就可以使用该类设置消息接收器进行调用拦截这将在不依赖库的情况下为您提供所需的功能。

如果您需要大规模执行此操作(即针对程序中的每个函数),并且不希望对源代码进行大量更改,您可以考虑使用。使用起来有点麻烦,因为你必须构建免费的线程COM对象来实现这一点,但它可以让你对程序的执行进行大量的控制。

这就是我选择用来解决问题的解决方案。由于没有自动的(类似属性的)方法来完成这项工作,我觉得它是最不显眼的,并且允许通过选择实例化什么类来打开和关闭功能。请注意,这不是我问题的最佳答案,但它是针对我的特殊情况的更好答案

我们只是在派生第二个类,它有时或总是被实例化来代替其父类。我们要跟踪(或以其他方式跟踪)的方法被声明为虚拟,并在派生类中重新实现,以执行我们要跟踪的任何操作,然后在父类中调用该函数

public class TestClass {

  public virtual void int SomeFunction( string /*str*/ )
  {
    return 0;
  }


  public void TestFun()
  {
    SomeFunction( "" );
  }

}


public class TestClassTracer : TestClass {

  public override void int SomeFunction( string str )
  {
    // do something
    return base.SomeFunction( str );
  }

}

使用代理

delegate void SomeFunctionDelegate(string s);

void Start()
{
  TraceAndThenCallMethod(SomeFunction, "hoho");
}

void SomeFunction(string str)
{
  //Do stuff with str
}

void TraceAndThenCallMethod(SomeFunctionDelegate sfd, string parameter)
{
  Trace();
  sfd(parameter);
}

但它的速度非常慢,以至于无法使用。我不同意这个评论。。。我已经在开发解决方案时多次使用它,虽然它确实有开销,但它远不是不可用的。答案正确,链接错误。您链接到的这篇文章是关于旧版本1.0的,它与当前版本2.1不兼容。如果您觉得ContextBoundObject有些帮助,请将我的答案从-1:)中选出来。如果您只想使用核心.NET库,这是一个很好的解决方案。