在.NET中,有没有一种方法可以在调用另一个方法之后但在输入之前自动调用该方法
本文关键字:方法 调用 之后 另一个 输入 有没有 NET 一种 | 更新日期: 2023-09-27 17:48:48
我想要的是一种在调用另一个方法之后但在输入该方法之前调用该方法的方法。示例:
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类。
您可以使用动态代理(例如Castle的DynamicProxy)来拦截调用,运行您想要的任何代码,然后根据需要调用或不调用您的方法。
使用*核心方法:
public int SomeFunction(string str)
{
Tracer();
return SomeFunctionCore(str);
}
private int SomeFunctionCore(string str)
{
return 0;
}
许多.NET API都使用这个(很多都是在WPF中使用的)。
使用委托
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);
}
您希望了解面向方面编程。下面是我在.NET中为AOP找到的一个页面:http://www.postsharp.org/aop.net/
面向方面编程涉及从代码中分离出"横切关注点"。其中一个例子是日志记录——日志记录(希望)存在于所有代码中。这些方法真的需要了解日志记录吗?也许不是。AOP研究的是将这些关注点从它们处理的代码中分离出来,并在编译时或运行时将它们重新注入。我发布的链接包含到几个工具的链接,这些工具可以用于编译时和运行时AOP。
.NET有一个名为ContextBoundObject的类,只要您不介意从基类派生,您就可以使用它来设置消息接收器以执行调用拦截,这将在不需要库依赖的情况下为您提供所需内容。
您必须使用某种形式的AOP框架(如SpringFramework.NET)才能做到这一点。
如果您需要大规模地执行此操作(即针对程序中的每个函数),并且您不想对源代码进行巨大的更改,则可以考虑使用.NET评测API。它的使用有点麻烦,因为你必须构建免费的线程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 );
}
}