メソッドやプロパティの名前を実行時に解決したい時には、以下の方法で動的に呼び出します。
簡単なサンプルで見てみます。
呼び出されるクラスは以下の通り:
// 呼び出されるクラス class TestClass { // プロパティ private string myName = string.Empty; public string MyName { get { return myName; } set { myName = value; } } // 引数なしのメソッド // 引数ありのメソッド |
呼び出し側は以下の通り:
// 呼び出し方の例 class Program { static void Main(string[] args) { TestClass tc = new TestClass(); Type ttc = tc.GetType(); // 引数なしのメソッド // 引数ありのメソッド // プロパティの読み書き // Get |
ポイントは、
- オブジェクトの型をGetTypeで取得する
- メソッド名、プロパティ名を指定して、Type.GetMethod,Type.GetPropertyを呼び出す。戻り値はSystem.Reflection名前空間の MethodInfo, PropertyInfo で受ける
- メソッドの場合には、MethodInfo.Invoke でメソッドを呼び出す。その際、呼び出したいメソッドが引数なしならば Invoke の第2引数は null、引数ありならばnew object[] { ... };とする
- パラメータの場合には、PropertyInfo.SetValue, GetValue を呼び出す。なお、GetValueの戻り値はObject型なので適切にキャストする。
頻繁に使うテクニックではありませんが、こんなことができるということを覚えておくといいでしょう。