アプリケーションの定型コードを短くしたい (1)
05/29/2011

ShortRefl1.AbstractModel

using System;
using System.Collections.Generic;
using System.Collections;

using System.Reflection;

namespace CodeCompress.ShortRefl1
{
    public abstract class AbstractModel
    {
        protected void OnPropertyChanged(string propertyName)
        {
            ;
        }

        protected abstract IEnumerable Validate(string propertyName);

        /// <summary>
        /// リフレクションを使ったコピー
        /// このコピーのレギュレーションは、すべての「プロパティ」同士のコピー
        /// </summary>
        /// <param name="src">コピー元</param>
        /// <param name="dst">コピー先</param>
        protected void CopyByRefl(object src, object dst)
        {
            PropertyInfo[] piArray = src.GetType().GetProperties();
            foreach (PropertyInfo pi in piArray)
            {
                pi.SetValue(dst, pi.GetValue(src, null), null);
            }
        }

        /// <summary>
        /// プロパティセッター名のset_プレフィクスを取り除く
        /// </summary>
        /// <param name="setterName">セッター名</param>
        /// <returns>set_プレフィクスがないセッター名</returns>
        protected string RemoveSetterPrefix(string setterName)
        {
            return setterName.Substring(4);
        }

        /// <summary>
        /// プロパティの値保存用のコンテナ
        /// </summary>
        protected Dictionary<string, object> _propValues = new Dictionary<string, object>();

        protected void SetPropValue(string propertyName, object val, object src)
        {
            object o = GetPropValue(propertyName, src);

            if (o != null)
            {
                if (o.Equals(val))
                {
                    return;
                }
            }
            _propValues[propertyName] = val;
            this.OnPropertyChanged(propertyName);
        }

        protected object GetPropValue(string propertyName, object src)
        {
            if (_propValues.ContainsKey(propertyName))
            {
                return _propValues[propertyName];
            }
            else
            {
                Type t = src.GetType().GetProperty(propertyName).PropertyType;
                if (t == typeof(string))
                {
                    return null;
                }
                else if (t == typeof(int))
                {
                    return 0;
                }
                else if (t == typeof(decimal))
                {
                    return 0m;
                }
                else if (t == typeof(bool))
                {
                    return false;
                }
                else if (t == typeof(DateTime))
                {
                    return DateTime.MinValue;
                }

                return null;
            }
        }
    }
}

Top of Site
Copyright (c) 2011 Takao Tamura