私の目標: 他のクラスの中から検索して実行できる特定のメソッドを含むC#スクリプトを他の人が追加できるようにするシステムがあります。ランタイム。タイプ変数を持つメソッドを動的に呼び出す
私のアプローチ: 私は、リフレクションを使用してインターフェイスを実装し、メソッド名はすべて、それらのクラスの間で同じにする必要があり、それらを一覧表示し、任意のクラスを通してので、私ができるループ方式とのインタフェースを作成しました。
ルックアップ中に見つかったすべてのクラスの列挙型を持つクラスがあり、ユーザーは実行時にそれらのクラスを選択できます。
これで、選択したクラスタイプのメソッドを取得してそのメソッドを呼び出すことができるようにする必要があります。問題は特定のメソッドの名前を知っていることですが、クラスのタイプは変数として保存されます。
コード:メモリから
//擬似コード:感謝
//Possible solution 1:
Type selectedType = typeSelectedByEnum;
MethodInfo genericMethod = selectedType.GetMethod("TheInterfaceMethod").MakeGenericMethod(selectedType);
genericMethod.Invoke(selectedType, new object[0]);
//Possible solution 2: (however I would much prefer to use something avaliable prior to .NET 4.6)
Type selectedType = typeSelectedByEnum;
dynamic changedObj = Convert.ChangeType(selectedType, selectedType);//-Something here needs to implement IConvertable, how would I set this up?
changedObj.TheInterfaceMethod();
//Possible solution 3:
//Your solution??!
すべてのヘルプ、私は多くのことを試してみましたが、ただの可能性のあるランタイム代替約開いていているこの時点で。必要に応じてより多くのコードを提供することができます。
:のは、あなたのインタフェースがIAwesomeInterfaceと呼ばれていると仮定しましょうか?ソリューション1ではどうなりますか?また、 'TheInterfaceMethod'はインスタンスメソッドですか?または静的メソッド?それがインスタンスメソッドの場合:どのオブジェクトを使用する必要がありますか?静的メソッドの場合:最初のパラメータに 'null'を渡します –
選択リストに実際のオブジェクトを保持できますか?表示された名前を列挙型ではなく共通のインタフェースに置きます。次に、選択したオブジェクトから直接メソッドを呼び出すことができます。 – user6144226
@ user6144226 nice;これらのオブジェクトが実際に 'List'にあった場合、 'theList [(int)enumValue] .TheInterfaceMethod();' –