Evet kesinlikle.
Bir nesne manipüle etmek istiyorsanız ben aslında böyle bir işlevi kullanın:
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;
}
Bu hat:
MethodBase method = new StackFrame(2).GetMethod();
Çağrı yöntemini bulmak için yığın çerçevesini açar, ardından genel bir hata raporlama işlevi için kendisine aktarılan parametre bilgi değerlerini elde etmek için yansımayı kullanırız. Geçerli yöntemi almak için bunun yerine geçerli yığın çerçevesini (1) kullanın.
Diğerlerinin geçerli yöntemler adı için söylediği gibi şunları da kullanabilirsiniz:
MethodBase.GetCurrentMethod()
Yığın yürümeyi tercih ederim, çünkü bu yönteme dahili olarak bakarsanız, sadece bir StackCrawlMark oluşturur. Yığına hitap etmek benim için doğrudan daha net görünüyor
Post 4.5 artık yöntem adının bir dizesini almak için yöntem parametrelerinin bir parçası olarak [CallerMemberNameAttribute] kullanabilirsiniz - bu bazı senaryolarda yardımcı olabilir (ama gerçekten yukarıdaki örnekte)
public void Foo ([CallerMemberName] string methodName = null)
Bu daha önce INTifyPropertyChanged desteği için daha önce olay kodunuz aracılığıyla tüm dizeleri çöp vardı bir çözüm gibi görünüyordu.