技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

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

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

さくっと作ってみた。
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!");
        }
    }
}