1

少し助けが必要です!

実行時にカスタム コントロールを作成し、情報を含む xml を逆シリアル化しています。カスタム コントロールには 2 つのプロパティがあります。1 つはイベントの名前、もう 1 つはイベントが発生したときに実行するコード (つまり、メソッド本体) です。

2 つの変数の値を抽出します。私が必要とするのは、変数に格納されたコードを実行するイベントのために、実行時にコントロールに追加してハンドラを追加することです。

string eventName = "Click";
string codeToRun= "MessageBox.Show(\"Hello!\");"
Type tControl = result.GetType();
EventInfo ev = tControl.GetEvent(eventName);
Type tDelegate = ev.EventHandlerType;
MethodInfo addHandler = ev.GetAddMethod();

Type returnType = tDelegate.GetMethod("Invoke").ReturnType;

ParameterInfo[] parameters = tDelegate.GetMethod("Invoke").GetParameters();
Type[] typeParameters = new Type[parameters.Length];
for (int i = 0; i < parameters.Length; i++)
{
    typeParameters[i] = parameters[i].ParameterType;
}

DynamicMethod handler = new DynamicMethod(
                        "",
                        null,
                        typeParameters);

//here I need to compile and add my custom source code stored in codeToRun

Delegate dEmitted = handler.CreateDelegate(tDelegate);
addHandler.Invoke(result, new Object[] { dEmitted });

助言がありますか?よろしくお願いします。

4

1 に答える 1

1

そもそもなぜメソッドを取得しているのか、私にはわかりませんaddHandler。電話できませんか?

ev.AddEventHandler(result, dEmitted);

? デリゲートを正しく作成した場合は問題なく、add ハンドラー メソッドを直接呼び出すよりも簡単です。

あなたの質問が実際に動的メソッドの作成に関するものである場合、それは別の問題ですCSharpCodeProvider。ソース コードをアセンブリに動的にコンパイルすることを検討することをお勧めします。ただし、これはイベント処理部分とは完全に別の演習として扱います。コンパイルを機能させてから、イベント ハンドラー フックアップを後で機能させます。

使用方法の例として、Snippyのソース コードをCSharpCodeProvider参照することをお勧めします。これは、コードのスニペットをコンパイルして実行できる C# in Depth 用に私が作成した単純なツールです。

于 2012-02-10T14:41:31.460 に答える