登录C#时,如何学习调用当前方法的方法的名称?我知道所有这些System.Reflection.MethodBase.GetCurrentMethod(),但我想在堆栈跟踪中向下迈出一步.我考虑过解析堆栈跟踪,但我希望找到一种更清晰,更明确的方法,比如Assembly.GetCallingAssembly()方法.
如何在c#中找到调用方法的全名.我见过解决方案:
但他们只给我顶级水平.考虑这个例子:
namespace Sandbox
{
class Program
{
static void Main(string[] args)
{
test();
}
static void test()
{
var stackTrace = new StackTrace();
var methodBase = stackTrace.GetFrame(1).GetMethod();
Console.WriteLine(methodBase.Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这只是输出'Main'如何让它打印'Sandbox.Program.Main'?
在任何人开始询问我为什么需要使用它之前,它是一个我正在处理的简单日志框架.
编辑
添加到Matzi的答案:
这是解决方案:
namespace Sandbox
{
class Program
{
static void Main(string[] args)
{
test();
}
static void test()
{
var stackTrace = new StackTrace();
var methodBase = stackTrace.GetFrame(1).GetMethod();
var Class = methodBase.ReflectedType;
var Namespace = Class.Namespace; //Added finding the namespace
Console.WriteLine(Namespace + …Run Code Online (Sandbox Code Playgroud) 我有一个像这个例子的界面:
Interface IRequest{
List<profile> GetProfiles();
void SetProfile (Profile p);
}
Run Code Online (Sandbox Code Playgroud)
现在,在某些日志记录组件中,我无法访问实现该接口的对象,但我想使用接口中方法的名称.我当然可以将它们键入为字符串(将方法名称复制到字符串中),但我想使用强类型,因此我不必保持方法名称和字符串同步.
在伪代码中,我会这样做:
string s= IRequest.GetProfiles.ToString()
Run Code Online (Sandbox Code Playgroud)
这有可能吗?
编辑:
也许我应该调用它:使用接口,就像它是一个枚举字符串s = IRequest.GetProfiles.ToString()
在C#中是否可以创建一个只能从另一个函数中调用的函数?
你可以这样做吗?
private void a()
{
b();
c();
...do something else
private void b()
{
..do something but can only be called from a()
}
private void c()
{
..do something but can only be called from a()
}
}
Run Code Online (Sandbox Code Playgroud)
我想要这样做的原因是该功能b()和c()拆分一些实现细节,a()它们只是更清晰,更容易在自己的范围内阅读.但是,这些函数对于类没有用,因为a()在调用它们之后必须进行一些处理.