2008-10-10 83 views
5

我在寻找的是调用另一个方法但调用其他方法之前调用方法的方法。例如:SomeFunction()之后调用在.NET中有一种方法可以在调用另一个方法之后但在输入之前自动调用方法

public class Test { 

    public void Tracer (...) 
    { 
    } 

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

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

} 

在上述我想有示踪(例子中)已经由TestFun调用(),但被输入SomeFunction()之前。我也想获得SomeFunction()的反射数据。


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

就像一个笔记一样,我将研究一些其他应用程序的AOP和ContextBoundObject类。

+0

如果您发现ContextBoundObject有所帮助的请投我的​​答案出来-1 :)这是一个很好的解决方案,如果你只想使用核心.NET库。 – 2009-04-21 18:38:14

回答

5

您可以使用动态代理(例如Castle's DynamicProxy)拦截呼叫,运行您希望的任何代码,然后根据您的需要调用或不调用您的方法。

+0

正确的答案,错误的链接。您链接到的这篇文章是关于旧版本1.0,它与当前版本的v2.1不兼容。 – 2009-03-27 08:49:18

+0

谢谢Krzysztof - 我更新了链接! – 2010-07-19 15:44:44

2

使用*核心方法:

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

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

许多的.NET的API的使用(很多在WPF做)。

1

你想看看面向方面编程。以下是我在.NET中为AOP找到的一个页面:http://www.postsharp.org/aop.net/

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

1

.NET有一个名为ContextBoundObject的类,您可以使用它来设置消息接收器来执行调用截取,只要您不介意从基类派生,这会给你你正在寻找什么而不需要依赖库依赖项。

0

如果您需要大规模(即对于程序中的每个功能)执行此操作,并且您不想大幅改变源,则可以使用.NET Profiling API进行调查。由于必须构建自由线程的COM对象才能使用它,所以它有点多毛,但它使您能够对程序的执行进行大量的控制。

0

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

发生什么事情是我们只是简单地派生出第二个类,它有时或总是被实例化而不是父类。我们想要跟踪(或以其他方式跟踪)的方法被声明为虚拟的,并在派生类中重新实现,以执行我们想要跟踪的任何操作,然后在父类中调用该函数。

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

} 
2

使用代表!

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); 
} 
相关问题