読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

フレームワーク作成支援ツールを作ってみた。

.NET Tips OSS

イベントハンドラで似たことやってるとか、イベントハンドラの例外処理とか一括でやりたいとかいう時に便利そうなツール。

さくっと作ってみた。
BSD ライセンスとでもしとくので好きに使ってほしい。

http://www.white-azalea.net/EventInjector.zip

.NET 3.5 でできてるけど、コード自体はリフレクションくらいしか使った記憶がないので、ちょっとカスタムすれば 2.0 で使える。

要望あったら米もらえば答えるかもしれない。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using EventInjector;

namespace SampleForm
{
    // designer.cs は省略。知ってる人なら速攻どんなのかわかるかと。
    public partial class Form1 : Form
    {
        public static EventHandler CreateWrapedHandler(Delegate eventMethod)
        {
            return delegate(object sender, EventArgs args)
            {
                try
                {
                    eventMethod.DynamicInvoke(sender, args);
                }
                catch (TargetInvocationException except)
                {
                    MessageBox.Show(except.InnerException.Message);
                }
            };
        }

        public Form1()
        {
            InitializeComponent();

            //// イベントの一覧を取得します。
            //Dictionary<MethodInfo, List<EventInjectionAttribute>> dictionary;
            //dictionary = ReflectionUtility.SearchEventMethodInfo(this);

            //// メソッドごとに処理を行います。
            //foreach (var pair in dictionary)
            //{
            //    // メソッドをラップします。
            //    Delegate data = Delegate.CreateDelegate(
            //        typeof(EventHandler), this, pair.Key);
            //    EventHandler handler = Form1.CreateWrapedHandler(data);

            //    // イベント登録をします。
            //    foreach (var reflectionInfo in pair.Value)
            //    {
            //        object target = ReflectionUtility.SearchObject(
            //            this, reflectionInfo.Instance);
            //        ReflectionUtility.SetEventHandler(
            //            target, handler, reflectionInfo.EventName);
            //    }
            //}

            ReflectionUtility.SetEventShortcut(
                this, this, Form1.CreateWrapedHandler);
        }

        [EventInjection("button1", "Click")]
        public void ButtonClick(object sender, EventArgs args)
        {
            this.label1.Text = "Hello message.";
            throw new Exception("HAHAHA!");
        }
    }
}