就像标题所说:反射可以为您提供当前正在执行的方法的名称.
由于海森堡的问题,我倾向于不猜.如何在不改变当前方法的情况下调用一种方法来告诉您当前的方法?但是我希望有人可以在那里证明我的错.
更新:
最终结果
我了解了MethodBase.GetCurrentMethod().我还了解到,我不仅可以创建堆栈跟踪,而且如果需要,我只能创建我需要的确切帧.
要在属性中使用它,只需使用.Substring(4)删除'set_'或'get_'.
如何在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) 在Unity中使用coroutines或InvokeRepeating时,您必须提供一个字符串,其中包含您要调用的函数的名称.虽然如果更改该函数的名称会很痛苦,因为您必须记住更改使用它的协同程序.这样做有更干净的方法吗?
目前它看起来像这样:
InvokeRepeating ("SendChangedValues", SEND_RATE, SEND_RATE);
Run Code Online (Sandbox Code Playgroud)
虽然有类似的东西会很好
InvokeRepeating (SendChangedValues.Name(), SEND_RATE, SEND_RATE); //or
InvokeRepeating (functions.GetName(SendChangedValues), SEND_RATE, SEND_RATE);
Run Code Online (Sandbox Code Playgroud)
这可能在c#中吗?或者其他确保我在更改函数名称而不更改这些字符串时收到错误/警告的内容.
编辑1:我能想到的最干净的事情是使用函数的名称创建一个const字符串,并将它放在函数本身之前.因此,更难忘记更改字符串,因为它就在它上面,而且我也只需要更改一个const字符串来更改所有协同程序.
谢谢!
我有一个案例,我将方法名称作为字符串传递给函数,但我不希望它硬编码.例如
void MyMethodName()
{
// some code
}
void SomeOtherMethod()
{
SomeExternalLibrary.ExternalClass.FunctionWithStringParameter("MyMethodName");
}
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西:
FunctionWithStringParameter(MyMethodName.ToString());
Run Code Online (Sandbox Code Playgroud)
这样我可以通过"查找所有引用"来跟踪方法调用,并且我可以毫无后顾之忧地使用重构.