S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

BeanからIDictionaryへの変換

C#ではBeanって言葉よりPOCOってのがいいの?
で、Propertyから値を取得して、Property名をキーにしたIDictionaryを作るっての。
ちょっと初Quillとか初Seasarコンポーネントとかも合わせて。
1つ目のソース

BeanToDicConv Bean→ディクショナリ変換クラス
BeanToDicConvException Bean→ディクショナリ変換例外クラス
TestBean テスト用Beanクラス

2つ目のソース

IDicFactory ディクショナリオブジェクト生成インターフェース

3つ目のソース

DicFactory ディクショナリオブジェクト生成クラス

BeanToDicConvに、QuillのDIでDicFactoryオブジェクトを突っ込んで、DicFactoryにディクショナリオブジェクトを生成させてみた。
BeanToDicConv自身はリフレクション使って、プロパティの名前と値を取得してディクショナリにAddしてるだけ。
という感じ。

using System;
using System.Collections.Generic;

namespace TrialProject.Jp.Saku
{
    /// <summary>
    /// Bean→ディクショナリ変換クラス<br />
    /// </summary>
    /// <remarks>
    /// ■履歴<br />
    /// [2010/12/14]S_a_k_U<br />
    /// 新規作成<br />
    /// </remarks>
    class BeanToDicConv
    {
        [STAThread]
        public static void Main()
        {
            // Bean→ディクショナリ変換オブジェクト生成
            BeanToDicConv process = new BeanToDicConv();
            // Bean→ディクショナリ変換
            IDictionary<string, object> dic = process.Convert(new TestBean("X01", 123, true, DateTime.Now));
            // ディクショナリのK-Vのカウント
            System.Diagnostics.Debug.WriteLine(dic.Count);
            foreach (string key in dic.Keys)
            {
                // ディクショナリのキーと値を出力
                System.Diagnostics.Debug.WriteLine("[KEY]" + key + "[VALUE]" + dic[key]);
            }
        }
        /// <summary>
        /// デフォルトコンストラクタ<br />
        /// </summary>
        /// <remarks>
        /// ■履歴<br />
        /// [2010/12/14]S_a_k_U<br />
        /// 新規作成<br />
        /// </remarks>
        public BeanToDicConv()
        {
            Seasar.Quill.QuillInjector.GetInstance().Inject(this);
        }
        /// <summary>
        /// ディクショナリオブジェクトファクトリ<br />
        /// </summary>
        /// <remarks>
        /// ■履歴<br />
        /// [2010/12/14]S_a_k_U<br />
        /// 新規作成<br />
        /// </remarks>
        private IDicFactory _DicFactory;
        public IDicFactory DicFactory
        {
            get
            {
                return this._DicFactory;
            }
            set
            {
                this._DicFactory = value;
            }
        }
        /// <summary>
        /// Beanをディクショナリに変換する。<br />
        /// </summary>
        /// <remarks>
        /// ■例外<br />
        /// [TestProject.Jp.Saku.BeanToDicConvException]<br />
        /// 変換に失敗した場合に発生する例外<br />
        /// ■履歴<br />
        /// [2010/12/14]S_a_k_U<br />
        /// 新規作成<br />
        /// </remarks>
        /// <param name="bean">
        /// Bean<br />
        /// </param>
        /// <returns>
        /// ディクショナリオブジェクト<br />
        /// </returns>
        public IDictionary<string, object> Convert(object bean)
        {
            IDictionary<string, object> dic = DicFactory.CreateDictionary();
            System.Type typ = bean.GetType();
            foreach (System.Reflection.PropertyInfo prop in typ.GetProperties())
            {
                try
                {
                    dic.Add(prop.Name, prop.GetValue(bean, null));
                }
                catch (Exception e)
                {
                    throw new BeanToDicConvException("Beanからディクショナリへの変換に失敗しました。", e);
                }
            }
            return dic;
        }
    }
    /// <summary>
    /// Bean→ディクショナリ変換例外クラス<br />
    /// </summary>
    /// <remarks>
    /// ■履歴<br />
    /// [2010/12/14]S_a_k_U<br />
    /// 新規作成<br />
    /// </remarks>
    class BeanToDicConvException : Exception
    {
        public BeanToDicConvException(string m, Exception e) : base(m, e)
        {
        }
    }
    /// <summary>
    /// テスト用Beanクラス<br />
    /// </summary>
    /// <remarks>
    /// ■履歴<br />
    /// [2010/12/14]S_a_k_U<br />
    /// 新規作成<br />
    /// </remarks>
    class TestBean
    {
        public TestBean(String Id, int Val, Boolean Flg, DateTime Date)
        {
            this.Id = Id;
            this.Val = Val;
            this.Flg = Flg;
            this.Date = Date;
        }
        private string _Id;
        public string Id
        {
            get
            {
                return this._Id;
            }
            set
            {
                this._Id = value;
            }
        }
        private int _Val;
        public int Val
        {
            get
            {
                return this._Val;
            }
            set
            {
                this._Val = value;
            }
        }
        private bool _Flg;
        public bool Flg
        {
            get
            {
                return this._Flg;
            }
            set
            {
                this._Flg = value;
            }
        }
        private DateTime _Date;
        public DateTime Date
        {
            get
            {
                return this._Date;
            }
            set
            {
                this._Date = value;
            }
        }
    }
}
using System.Collections.Generic;

namespace TrialProject.Jp.Saku
{
    /// <summary>
    /// ディクショナリオブジェクト生成インターフェース<br />
    /// </summary>
    /// <remarks>
    /// ■履歴<br />
    /// [2010/12/14]S_a_k_U<br />
    /// 新規作成<br />
    /// </remarks>
    [Seasar.Quill.Attrs.Implementation(typeof(TrialProject.Jp.Saku.DicFactory))]
    public interface IDicFactory
    {
        /// <summary>
        /// ディクショナリオブジェクトを生成する。<br />
        /// </summary>
        /// <remarks>
        /// ■履歴<br />
        /// [2010/12/14]S_a_k_U<br />
        /// 新規作成<br />
        /// </remarks>
        /// <returns>
        /// ディクショナリオブジェクト<br />
        /// </returns>
        IDictionary<System.String, System.Object> CreateDictionary();
    }
}
using System.Collections.Generic;

namespace TrialProject.Jp.Saku
{
    /// <summary>
    /// ディクショナリオブジェクト生成クラス<br />
    /// </summary>
    /// <remarks>
    /// ■履歴<br />
    /// [2010/12/14]S_a_k_U<br />
    /// 新規作成<br />
    /// </remarks>
    public class DicFactory : IDicFactory
    {
        /// <summary>
        /// ディクショナリオブジェクトを生成する。<br />
        /// </summary>
        /// <remarks>
        /// ■履歴<br />
        /// [2010/12/14]S_a_k_U<br />
        /// 新規作成<br />
        /// </remarks>
        /// <returns>
        /// ディクショナリオブジェクト<br />
        /// </returns>
        IDictionary<string, object> IDicFactory.CreateDictionary()
        {
            return new Dictionary<string, object>();
        }
    }
}

一応こんな感じで出力できたので、想定通りの動作に。

4
[KEY]Id[VALUE]X01
[KEY]Val[VALUE]123
[KEY]Flg[VALUE]True
[KEY]Date[VALUE]2010/12/15 1:33:13

空プロジェクトからSystem.Webアセンブリを参照する

男は黙って空プロジェクトから、ということで。
WindowsアプリケーションでSystem.Webアセンブリを参照するには?[VS 2010以降] − @IT