네 물론 이죠
객체를 조작하려면 실제로 다음과 같은 함수를 사용하십시오.
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 지원을위한 솔루션 인 것 같습니다.