Vâng chắc chắn.
Nếu bạn muốn một đối tượng thao tác, tôi thực sự sử dụng một hàm như thế này:
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;
}
Đường thẳng này:
MethodBase method = new StackFrame(2).GetMethod();
Đi lên khung ngăn xếp để tìm phương thức gọi sau đó chúng ta sử dụng sự phản chiếu để thu được các giá trị thông tin tham số được truyền cho nó cho một hàm báo cáo lỗi chung. Để có được phương thức hiện tại, chỉ cần sử dụng khung stack hiện tại (1).
Như những người khác đã nói cho tên phương thức hiện tại, bạn cũng có thể sử dụng:
MethodBase.GetCurrentMethod()
Tôi thích đi bộ stack hơn vì nếu nhìn vào bên trong phương thức đó, nó chỉ đơn giản là tạo một StackCrawlMark. Việc giải quyết trực tiếp Stack có vẻ rõ ràng hơn với tôi
Bài 4.5 bây giờ bạn có thể sử dụng [CallerMemberNameAttribution] như một phần của tham số phương thức để lấy chuỗi tên phương thức - điều này có thể giúp ích trong một số trường hợp (nhưng thực sự nói ví dụ ở trên)
public void Foo ([CallerMemberName] string methodName = null)
Đây dường như chủ yếu là một giải pháp cho hỗ trợ INotifyPropertyChanged, nơi trước đây bạn có các chuỗi rải rác thông qua mã sự kiện của bạn.