はい、間違いなく。
オブジェクトを操作したい場合は、実際に次のような関数を使用します。
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 を作成するだけなので、スタックを歩くことを好みます。スタックに直接アドレス指定する方が明確に思えます
Post 4.5 では、[CallerMemberNameAttribute] をメソッド パラメータの一部として使用して、メソッド名の文字列を取得できるようになりました。これは、いくつかのシナリオで役立つ場合があります (ただし、実際には上記の例で言えば)。
public void Foo ([CallerMemberName] string methodName = null)
これは主に、以前はイベント コード全体に文字列が散らばっていた INotifyPropertyChanged サポートのソリューションのようです。