関数とその所有者クラスを入力引数として取り、その名前をリフレクションで処理する必要があるメソッドがあります。もちろんstring
、入力引数として s をいくつか取ることもできるので、メソッドは次のようになります。
void Proceed(string className, string methodName)
{
Console.WriteLine($"{className}.{methodName} called");
//...
}
次のように呼び出されます。
Proceed(nameof(Foo), nameof(Foo.Bar));
nameof
しかし、メソッドを呼び出そうとするたびにキーワードを書かないようにする方法はあるのだろうか。私にとってProceed<Foo>(f => f.Bar)
は、もっと素敵に見えるようなものです。
これは式で解決できると思います。私が直面している問題は、メソッドに引数がある場合、メソッドを呼び出すときにそれらを明示的に指定する必要があることです (後でメソッドの名前Bar
だけが必要になる私の場合、これは過剰に思えます)。
だから、私が見つけた最良の解決策はこれです:
void Proceed<T>(Expression<Func<T, Action<object, object>>> expression)
{
//...
}
それでも、それ自体の引数で引数メソッドのシグネチャを指定しているため、十分に汎用的ではありません。
引数を指定せずに関数を引数として渡す方法があるかどうか疑問に思います (nameof
キーワードと同様に、後でその名前のみが必要になる場合)。