就像标题说的:反射能给你当前正在执行的方法的名字吗?
我倾向于认为不是,因为海森堡的问题。如何调用一个方法,在不改变当前方法的情况下告诉您当前方法?但我希望有人能证明我错了。
更新:
第2部分:这也可以用于在代码中查找属性吗? 第三部分:演出是什么样的?
最终结果 我学习了MethodBase.GetCurrentMethod()。我还了解到,我不仅可以创建堆栈跟踪,还可以只创建我需要的确切帧。
要在属性中使用它,只需使用. substring(4)来删除'set_'或'get_'。
就像标题说的:反射能给你当前正在执行的方法的名字吗?
我倾向于认为不是,因为海森堡的问题。如何调用一个方法,在不改变当前方法的情况下告诉您当前方法?但我希望有人能证明我错了。
更新:
第2部分:这也可以用于在代码中查找属性吗? 第三部分:演出是什么样的?
最终结果 我学习了MethodBase.GetCurrentMethod()。我还了解到,我不仅可以创建堆栈跟踪,还可以只创建我需要的确切帧。
要在属性中使用它,只需使用. substring(4)来删除'set_'或'get_'。
当前回答
从2021年到2022年,为客户提供更具弹性的解决方案:
namespace my {
public struct notmacros
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string
whoami( [CallerMemberName] string caller_name = null)
{
if (string.IsNullOrEmpty(caller_name))
return "unknown";
if (string.IsNullOrWhiteSpace(caller_name))
return "unknown";
return caller_name;
}
}
} // my namespace
使用
using static my.notmacros
// somewhere appropriate
var my_name = whoami() ;
.NET小提琴链接的实际演示:
https://dotnetfiddle.net/moK73n
请注意编译器要求:.NET 6
其他回答
简单的处理方法是:
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name;
如果系统。反射包含在using块中:
MethodBase.GetCurrentMethod().DeclaringType.FullName + "." + MethodBase.GetCurrentMethod().Name;
Lex提供的片段有点长,所以我指出了重要的部分,因为没有其他人使用完全相同的技术:
string MethodName = new StackFrame(0).GetMethod().Name;
这将向MethodBase.GetCurrentMethod()返回相同的结果。命名技巧,但它仍然值得指出,因为我可以在它自己的方法中实现一次,使用前一个方法的索引1,并从许多不同的属性调用它。此外,它只返回一帧而不是整个堆栈跟踪:
private string GetPropertyName()
{ //.SubString(4) strips the property prefix (get|set) from the name
return new StackFrame(1).GetMethod().Name.Substring(4);
}
这也是一行代码;)
我认为你应该能够从创建一个StackTrace。或者,正如@edg和@Lars Mæhlum提到的,MethodBase.GetCurrentMethod()
肯定是的。
如果你想操纵一个对象,我实际上使用这样的函数:
public static T CreateWrapper<T>(Exception innerException, params object[] parameterValues) where T : Exception, new()
{
if (parameterValues == null)
{
parameterValues = new object[0];
}
Exception exception = null;
StringBuilder builder = new StringBuilder();
MethodBase method = new StackFrame(2).GetMethod();
ParameterInfo[] parameters = method.GetParameters();
builder.AppendFormat(CultureInfo.InvariantCulture, ExceptionFormat, new object[] { method.DeclaringType.Name, method.Name });
if ((parameters.Length > 0) || (parameterValues.Length > 0))
{
builder.Append(GetParameterList(parameters, parameterValues));
}
exception = (Exception)Activator.CreateInstance(typeof(T), new object[] { builder.ToString(), innerException });
return (T)exception;
}
这条线:
MethodBase method = new StackFrame(2).GetMethod();
遍历堆栈帧以查找调用方法,然后使用反射获取传递给它的参数信息值,用于通用错误报告函数。要获得当前方法,只需使用当前堆栈框架(1)即可。
正如其他人所说的,当前方法的名称你也可以使用:
MethodBase.GetCurrentMethod()
我更喜欢遍历堆栈,因为如果在内部查看该方法,它只是创建了一个StackCrawlMark。对我来说,直接寻址堆栈似乎更清楚
在4.5之后,你现在可以使用[CallerMemberNameAttribute]作为方法参数的一部分来获取方法名的字符串——这在某些情况下可能会有帮助(但实际上在上面的例子中)
public void Foo ([CallerMemberName] string methodName = null)
这似乎主要是INotifyPropertyChanged支持的解决方案,以前你在你的事件代码中到处都是字符串。
对于可以使用的非异步方法
System.Reflection.MethodBase.GetCurrentMethod().Name;
https://learn.microsoft.com/en-us/dotnet/api/system.reflection.methodbase.getcurrentmethod
请记住,对于异步方法,它将返回“MoveNext”。