代码之家  ›  专栏  ›  技术社区  ›  A G

方法A和B调用方法C。现在如何找出C内部谁调用了它?

c#
  •  1
  • A G  · 技术社区  · 15 年前

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

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

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

    还有其他想法吗?

    7 回复  |  直到 15 年前
        1
  •  12
  •   Gishu    15 年前

    代码嗅觉。

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

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

    例如,如果类baker支持bake(cakespec),那么无论是由customera还是customerb调用,它的行为都应该相同。您可能需要通过cakespec中的一些配置参数自定义烘焙的某些方面。但是,总的来说,bake()应该按照它所说的做。

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

        2
  •  2
  •   leppie    15 年前

    看看 StackTrace 但正如乔恩所说,代码有气味。

        3
  •  2
  •   Jasper    15 年前

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

    StackTrace stackTrace = new StackTrace();
    MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();
    
        4
  •  1
  •   Pablo    15 年前

    我会这样做:

    enum Funcs {A, B};
    
    C(Func.A);
    ..
    C(Func.B);
    
    
    public void C(Funcs f) 
    { 
        if(f == Funcs.A) { .... } 
        if(f == Funcs.B) { .... } 
    } 
    
        5
  •  1
  •   EMP    15 年前

    我想你 可以 用反省的方法来找出这一点,如果你 真的? 想(我还没做过),但在生产代码中使用它是个坏主意。正如你所说,设置国旗是一个更好的主意。事实上,国旗应该有语义意义,而不是“谁给我打电话”。找到调用方方法对于日志记录和其他诊断目的最有用。

    编辑: 尝试了我想用的反射法 System.Reflection.RuntimeMethodInfo.InternalGetCurrentMethod() )但它不起作用。:(

        6
  •  0
  •   eee    15 年前

    如果这是C编程,我可以使用函数指针技术来实现它,前提是A和B具有相同的参数。A和B将在其中一个参数中传递身份信息,以便C知道谁在呼叫…win32 api中的wndproc()设计,其中消息是id,参数是数据。

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

        7
  •  0
  •   Natasha    15 年前

    您可以发送一个参数来识别哪个调用方是C,比如0代表A,1代表B。 但我想这算是糟糕的编程…