C# 方法A和B调用方法C。现在如何找出C中调用它的人?

C# 方法A和B调用方法C。现在如何找出C中调用它的人?,c#,C#,我在方法C中有一些代码,将根据调用它的人来执行 public void C() { if(A called me) { .... } if(B called me) { .... } } 一种方法是使用标志变量。在调用C之前设置变量,然后在C内部处理标志 还有其他想法吗?我想如果你真的想知道的话,你可以使用反射来发现这个问题,我还没有做过,但是在生产代码中使用反射是个坏主意。正如你所说,树立旗帜是一个更好的主意。事实上,国旗应该有语义,而不是谁叫我的。找出调用方方法对于日志记录

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

public void C()
{
    if(A called me) { .... }
    if(B called me) { .... }
}
一种方法是使用标志变量。在调用C之前设置变量,然后在C内部处理标志

还有其他想法吗?

我想如果你真的想知道的话,你可以使用反射来发现这个问题,我还没有做过,但是在生产代码中使用反射是个坏主意。正如你所说,树立旗帜是一个更好的主意。事实上,国旗应该有语义,而不是谁叫我的。找出调用方方法对于日志记录和其他诊断目的最有用

编辑:尝试了我想调用System.Reflection.RuntimeMethodInfo.InternalGetCurrentMethod的反射方法,但它不起作用:

我想如果你真的想知道的话,你可以使用反射来发现这个问题,我还没有做过,但是在生产代码中使用反射是个坏主意。正如你所说,树立旗帜是一个更好的主意。事实上,国旗应该有语义,而不是谁叫我的。找出调用方方法对于日志记录和其他诊断目的最有用

编辑:尝试了我想调用System.Reflection.RuntimeMethodInfo.InternalGetCurrentMethod的反射方法,但它不起作用:

代码气味

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

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

需要更多信息。。关于你想要达到的目标。

代码气味

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

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

需要更多信息。。看看StackTrace类,但正如Jon所说,代码有味道

看看StackTrace类,但正如Jon所说,代码有味道

我会这样做:

enum Funcs {A, B};

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


public void C(Funcs f) 
{ 
    if(f == Funcs.A) { .... } 
    if(f == Funcs.B) { .... } 
} 
我会这样做:

enum Funcs {A, B};

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


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

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


在C中,我认为您可以使用委托。

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


在C中,我认为您可以使用委托。

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

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

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

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

您可以发送一个参数来标识哪些调用了c,比如0代表a,1代表B
但我想这算是糟糕的编程…

您可以发送一个参数来标识哪些调用了c,比如0代表a,1代表B
但我想这算是糟糕的编程…

我知道。。。但这是一个已经开发的生产代码,我正在工作。也许我需要修改我的逻辑。谢谢。@Aseem-做正确的事。。。在可爱的小虎崽长大并吃早餐之前把它修好。我今天一定要猎杀一些小虎崽我在审计中使用了stacktrace。而不是logBake,someInfo和logGarnish,someInfo-只是logsomeInfo。在C++或C中,我会做得不同。我知道…但这是一个已经开发的生产代码,我正在工作。也许我需要修改我的逻辑。谢谢。@Aseem-做正确的事。。。在可爱的小虎崽长大并吃早餐之前把它修好。我今天一定要猎杀一些小虎崽我在审计中使用了stacktrace。而不是logBake,someInfo和logGarnish,someInfo-只是logsomeInfo。在C++或C中,我会做得不同。我认为堆栈跟踪会把完整的调用堆栈作为字符串。不管怎样,我要重新设计我的逻辑。。似乎是个坏主意。@Aseem Gautam:不,它包含一个StackFrame的列表,该列表依次包含调用MethodBase。我认为堆栈跟踪会将整个调用堆栈作为字符串给出。不管怎样,我要重新设计我的逻辑。。这似乎是个坏主意。@Aseem Gautam:不,它包含一个StackFrame的列表,而该列表又包含c
这就是阿塞姆在自己的回答中所建议的——设置一面旗帜。虽然这种方法在基于参数的抽象修改行为方面有其优点,但您的方法将行为明确地绑定到调用方,正如Gishu指出的那样,这很糟糕。扩展面包店的类比:你不希望有一种方法能为顾客B烤出不同的蛋糕,因为顾客B对坚果过敏;你想要一个标志,表明不要使用坚果,顾客B和任何其他坚果过敏的顾客在订购蛋糕时可以设置这个标志,但查看烘焙方法的人可以立即知道这个标志的作用和原因。这就是Aseem在自己的回答中建议的——设置一个标志。虽然这种方法在基于参数的抽象修改行为方面有其优点,但您的方法将行为明确地绑定到调用方,正如Gishu指出的那样,这很糟糕。扩展面包店的类比:你不希望有一种方法能为顾客B烤出不同的蛋糕,因为顾客B对坚果过敏;你想让一个标志表明不要使用坚果,这是顾客B和任何其他坚果过敏的顾客在订购蛋糕时可以设置的,但是查看烘焙方法的人可以立即告诉你这个标志的作用和原因。