将变量设置为包含方法的名称
这应该看起来很简单,但我有时间想象它。可以说我有一个方法:将变量设置为包含方法的名称
public Person person(string firstName, string lastName)
{
//code and such
string methodName = "Person person";
}
有没有办法创建一个变量并将其设置为方法的名称动态?我需要这个,所以当我调用自定义的异常方法时,我可以设置违规方法的名称进行日志记录。任何帮助,将不胜感激。如果你想要的类型太
System.Reflection.MethodBase.GetCurrentMethod().Name;
,你可以使用:
您可以使用此
var method = System.Reflection.MethodBase.GetCurrentMethod();
var methodName = string.Format("{0} {1}", method.DeclaringType.Name, method.Name);
编辑:现在,我看到你写的日志记录功能,您可能想从MSDN文档中尝试如下所示:
public void DoProcessing()
{
TraceMessage("Something happened.");
}
public void TraceMessage(string message,
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
{
Trace.WriteLine("message: " + message);
Trace.WriteLine("member name: " + memberName);
Trace.WriteLine("source file path: " + sourceFilePath);
Trace.WriteLine("source line number: " + sourceLineNumber);
}
[CallerMemberName]
属性指示编译器应该在调用函数中传递。这使得它比使用反射更快。看看这个链接获取更多信息:http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute(v=vs.110).aspx
“System.Reflection.MethodInfo.GetCurrentMethod()。Name”和您提供的答案有什么不同? – Ric
不,它是一个静态方法,所以你调用它的类型并不重要......无论是从MethodBase调用它。 –
我和你的答案一起去了,因为错误处理程序已经为我写了,我只是收紧代码,所以这个效果很好。话虽如此,你还提供了其他有用的代码,我可以在其他地方加入。 –
string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name;
另一种解决方法,如果使用的是.NET 4.5中使用CallerMemberName
属性。
public class Example
{
public void Foo()
{
Bar();
}
private void Bar([CallerMemberName] string caller = null)
{
Console.WriteLine(caller); //Writes "Foo"
}
}
它不会给你你所在的函数的名字,而是你调用函数的名字。我不知道这对您的例外处理程序是否有用,但它对于实施可能非常有用INotifyPropertyChanged
private string _exampleProperty;
public String ExampleProperty
{
get { return _exampleProperty; }
set
{
if (value == _exampleProperty) return;
_exampleProperty = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
是的,我没有提到,最初是因为他们要求**当前**方法的名称。但我同意这对记录目的更好。 –
反射是要走的路。 – everton
是否有理由需要这个? – Ric
你需要返回类型空间名称还是方法名? –