一般的に言えば、リフレクションを使用するとパフォーマンスに影響があることを認識しています。(実際、私自身は反省のファンではありません。これは純粋に学術的な質問です。)
次のようなクラスが存在するとします。
public class MyClass {
public string GetName() {
return "My Name";
}
}
ここで我慢してください。MyClass
呼び出された のインスタンスがあればx
、 を呼び出すことができることを知っていますx.GetName()
。さらに、Func<string>
変数を に設定できますx.GetName
。
ここで私の質問です。上記のクラスが呼び出されていることを知らないとしましょうMyClass
。あるオブジェクトを持っていますがx
、それが何であるかわかりません。GetName
これを行うことで、そのオブジェクトにメソッドがあるかどうかを確認できます。
MethodInfo getName = x.GetType().GetMethod("GetName");
nullgetName
ではないとします。getName.ReturnType == typeof(string)
次に、さらに ifとをチェックすることはできませんでしたか? この時点で、オブジェクトによって表されるメソッドが何らかの方法で , に確実にキャストできるgetName.GetParameters().Length == 0
と確信できませんか?getName
Func<string>
があることに気付きました。また、次のようなものをいつでも作成MethodInfo.Invoke
できることにも気付きました。Func<string>
Func<string> getNameFunc = () => getName.Invoke(x, null);
私が求めているのは、オブジェクトからそれが表す実際のメソッドに移動し、 processでリフレクションのパフォーマンス コストが発生する方法があるかどうかだと思いますが、その後はメソッドを直接呼び出すことができます (たとえば、 aまたは類似のもの)パフォーマンスの低下なし。MethodInfo
Func<string>
私が想定しているのは、次のようなものです。
// obviously this would throw an exception if GetActualInstanceMethod returned
// something that couldn't be cast to a Func<string>
Func<string> getNameFunc = (Func<string>)getName.GetActualInstanceMethod(x);
(私はそれが存在しないことを理解しています;私はそのようなものがあるかどうか疑問に思っています.)