一种在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;
}
}
我见过其他类似的帖子。但我的情况有点不同,因为:
- 我必须在之前和之后调用一个方法
- 在子类中,我还有多个具有不同方法名称的方法,其中每个方法都必须调用这些setup和teardown
- 参数可以是任何数字
您可以使用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程序员一直在使用这种技术。