方法A和B调用方法C.现在如何找出C里面的人叫它?

时间:2010-04-14 06:26:53

标签: c#

我在方法C中有一些代码可以根据调用它的人来执行。

public void C()
{
    if(A called me) { .... }
    if(B called me) { .... }
}

一种方法是使用标志变量。在调用C之前设置变量,然后在C中处理标志。

还有其他想法吗?

7 个答案:

答案 0 :(得分:12)

代码味道。

为什么C关心来电者?如果方法中的代码根据谁调用它而不同,那么您可能需要不同的方法

A() calls A_C()
B() calls B_C()

e.g。如果Baker类支持Bake(cakeSpec),则无论CustomerA或CustomerB是否调用它,它都应该具有相同的行为。您可能希望通过cakeSpec中的某些配置参数自定义烘焙的某些方面。但总的来说,Bake()应该按照它说的做。

需要更多信息......关于你想要实现的目标。

答案 1 :(得分:2)

看看StackTrace课程,但正如乔恩所说,代号闻起来。

答案 2 :(得分:2)

以下代码可用于检索las调用方法:

StackTrace stackTrace = new StackTrace();
MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();

答案 3 :(得分:1)

我认为你可以使用Reflection找到这个,如果你真的想要(我还没有这样做),但是使用它是个坏主意生产代码。如你所说,设置标志是一个更好的主意。事实上,旗帜应该具有语义含义,而不是“谁叫我”。找出调用方法对于日志记录和其他诊断目的最有用。

编辑:尝试了我正在考虑的反思方法(调用System.Reflection.RuntimeMethodInfo.InternalGetCurrentMethod())并且它不起作用。 :(

答案 4 :(得分:1)

我会这样做:

enum Funcs {A, B};

C(Func.A);
..
C(Func.B);


public void C(Funcs f) 
{ 
    if(f == Funcs.A) { .... } 
    if(f == Funcs.B) { .... } 
} 

答案 5 :(得分:0)

如果这是C编程,我可以通过使用函数指针技术来实现它,前提是A和B具有相同的参数。 A和B将在C的一个参数中传递一个标识信息,以便知道谁在调用... Win32 API中的WndProc()设计,其中消息是id,params是数据。

在C#中,我认为你可以使用代表。

答案 6 :(得分:0)

您可以发送一个参数来识别哪个calles c,例如0表示A,1表示B表示 但我想这算作糟糕的编程...