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