ใช่แน่นอน.
หากคุณต้องการให้วัตถุจัดการฉันใช้ฟังก์ชั่นเช่นนี้:
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 ซึ่งก่อนหน้านี้คุณมีสตริงที่เกลื่อนไปทั่วผ่านรหัสเหตุการณ์ของคุณ