C# 如何获取调用方方法名?

C# 如何获取调用方方法名?,c#,.net,visual-studio-2010,envdte,C#,.net,Visual Studio 2010,Envdte,有没有办法获取C#方法ie的所有调用方: 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 cu

有没有办法获取C#方法ie的所有调用方:

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获得方法体文本。也许有更好的方法来实现它,而不是试图解析这段代码

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

new StackFrame(1, true).GetMethod().Name
请注意,在发布版本中,编译器可能会内联被调用的方法,在这种情况下,上面的代码将返回调用方的调用方,因此为了安全起见,您应该使用以下内容装饰您的方法:

[MethodImpl(MethodImplOptions.NoInlining)]

来源:

正如乌兹克指出的那样,使用
StackFrame
当然是可能的,但为什么需要这样做呢


这是一种设计的味道。如果您的代码必须了解其调用者,则说明您的设计有问题。每一个这样的依赖都应该从你的类模型中抽象出来。

不太肯定,我理解你的问题,因为似乎没有人确定什么应该返回“调用者”。。。但是,可能会有一些帮助?

调用方将返回什么?不清楚您的上下文是什么。可能与@Gray重复:我不想获取当前方法的调用方方法名。我希望如果我给出方法名,代码应该返回传递的方法的调用方。在我给出的示例中,如果我将“getName”作为方法名,那么我的代码应该返回“Caller”。@Chandnisha如果希望它返回的是“Caller”,为什么要将
Customer
传递给
getName
?尝试使用
MethodBase.GetCurrentMethod()
,而不是
Caller
函数中的
getName
。请注意性能影响。请勿在生产代码中使用此选项。如果你认为你真的需要它,看看PostSharp@SteveB,我正打算说同样的话@wudzik:这将返回当前方法的调用方名称。我希望如果我给出了方法名,那么我的代码应该返回传递的方法的调用方。@ChandniShah所以你想创建一个新的StackFrame(2,true)。GetMethod()。name?@wudzik:我认为它不会起作用。我正在开发VisualStudio插件,从中分析项目的代码。所以,如果我从我的宿主项目中传递某个类的名称,那么从插件代码中。它应该给我调用方方法的名称。我认为这可能有助于调试,但我同意这似乎是您的生产代码不应该使用或依赖的东西。如果您在代码中设置断点,您可以随时检查整个堆栈跟踪。即使出于调试目的,也没有必要在代码中放入此类依赖项。。。代码将很快变得不可读和不可维护(很难更改!),这是有道理的;我不认为它应该在代码中长期存在。这显然像是在一种不包含VisualStudio附带的强大调试器的语言中所做的事情。它有一种临时的“Debug.WriteLine”的感觉,你可以加入它来帮助你更好地理解流程。对于还不熟悉调试器的人来说,这更像是一个教育性/新手工具。分析/优化可能有一些真正合法的用途,但我不能想出一个很好的例子。@RoyDictus:我的生产代码不依赖于此。我正在开发一个VisualStudio插件,在其中我必须解析代码。