2013-07-09 118 views
2

有没有办法让C#方法即所有来电者:如何获取调用方法名称?

public string Caller(string str) 
{  
    Customer cust = new Customer(); 
    cust.Firstname = "Peter"; 
    cust.LastName = "Beamer"; 
    string t = getName(cust); 
    return t; 
} 

private string getName(Customer customer) 
{ 
    return customer.Firstname +" "+ customer.LastName; 
} 

将返回:来电。

我现在可以得到的所有方法正文文本使用EnvDTE.CodeFunction。也许有更好的方法来实现它,而不是试图解析这些代码。

注意:我不想获取当前方法的调用方法名称。我想如果我给方法的名称,那么它将返回传递方法的调用方法名称。

+6

*什么*会返回'来电者?目前尚不清楚你的背景是什么。 –

+2

可能的重复[如何找到调用当前方法的方法?](http://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-c​​alled-the-current -method) – Gray

+0

@Gray:我不想获取当前方法的调用方法名称。我想如果我给方法名称比我的代码应该返回通过方法的调用者。在我给出的例子中,如果我给'getName'作为方法名,那么我的代码应该返回'Caller'。 – ChandniShah

回答

6
new StackFrame(1, true).GetMethod().Name 

注意,在发布版本的编译器可能会内联该方法被调用,在这种情况下,上面的代码将返回调用程序的调用程序,因此为了安全起见你应该装点你的方法:

[MethodImpl(MethodImplOptions.NoInlining)] 

来源:https://stackoverflow.com/a/1310148/1714342

+4

只要注意性能影响。不要在生产代码中使用它。如果你认为你真的需要它,看看PostSharp –

+0

@SteveB,我会说完全一样的东西! –

+0

@wudzik:这将返回当前方法的调用者名称。我想如果我给方法名称比我的代码应该返回通过方法的调用者。 – ChandniShah

3

虽然它肯定是可以做到使用StackFrame它作为wudzik指出,为什么你要这么做?

这是一种设计的气味。如果您的代码必须知道其调用者的知识,那么您的设计有些问题。每个这样的依赖都应该从你的类模型中抽象出来。

+0

我认为它可能对调试有帮助,但我同意它非常类似于生产代码不应该使用或依赖的东西。 – Gray

+1

如果您在代码中放置断点,您可以随时检查整个堆栈跟踪。将代码中的这种依赖关系放在代码中是不必要的,即使是为了调试的目的......代码很快就会变得难以理解和不可维护(很难改变!) –

+0

这很有道理;无论如何,我不认为它长期属于代码。它绝对看起来像你会用一种不包含Visual Studio附带的强大调试器的语言来做的事情。它只是有一种临时的'Debug.WriteLine'的感觉,你可以更好地理解流程。对于不熟悉调试器的人来说,更多的教育/新手工具。分析/优化可能有一些真正合法的用途,但我不能拿出一个很好的例子。 – Gray

4

并不真正我明白你在问什么,因为没有人确定应该返回什么“调用者”......但是,也许CallerMemberNameAttribute可能有一些帮助?