public void AddValueChanged(object component, EventHandler handler)
        {
            var objType = component.GetType();

            if (objType.GetInterface(typeof(IEnumerable).FullName) != null)
            {
                foreach (var objIns in (IEnumerable)component)
                {
                    if (objIns == null)
                    {
                        continue;
                    }
                    var tempType = objIns.GetType();
                    PropertyDescriptor pd;
                    if (Propertys.TryGetValue(tempType, out pd))
                    {
                        pd.AddValueChanged(objIns, handler);
                    }
                }
            }
            else
            {
                PropertyDescriptor pd;
                if (Propertys.TryGetValue(objType, out pd))
                {
                    pd.AddValueChanged(component, handler);
                }
            }
        }
示例#2
0
        /// <summary>
        /// 封装为实体对象
        /// </summary>
        /// <param name="reader">数据库读取器</param>
        /// <returns>实体对象的泛型集合</returns>
        protected List <TModel> GetModels(IDataReader reader)
        {
            var list = new List <TModel>();

            while (reader.Read())
            {
                TModel entry = new TModel();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    string       name = reader.GetName(i);
                    PropertyInfo property;
                    if (Propertys.TryGetValue(name, out property))
                    {
                        SetValue(entry, property.Name, IsNull(property, reader[property.Name]));
                    }
                    else
                    {
                        //对象包含此属性时添加到基类集合中
                        SetValue(entry, "Item", reader[name], new object[] { name });
                    }
                }
                list.Add(entry);
            }
            reader.Close();
            return(list);
        }
        public object GetPropertyOwner(ICustomTypeDescriptor ins)
        {
            PropertyDescriptor pd;

            if (Propertys.TryGetValue(ins.GetType(), out pd))
            {
                return(ins.GetPropertyOwner(pd));
            }
            return(null);
        }
        /// <summary>
        /// 指定されたインデックスパラメータを使用するインデクサへのアクセスを提供する<see cref="IndexerReflector{T}"/>を返します
        /// </summary>
        /// <param name="indexes">インデクサインデックスのパラメータ</param>
        /// <exception cref="System.MemberAccessException">指定されたインデクサは存在しません</exception>
        public IndexerReflector <T> IndexerExact <T>(params ReflectionParameter[] indexes)
        {
            PropertyInfo info = null;
            var          key  = ("Indexer:" + string.Join(",", indexes.Select(t => { return(t.Type.Name); }))).GetHashCode();

            if (!Propertys.TryGetValue(key, out info))
            {
                if (!PropertyReflector <T> .TryGetIndexerInfo(m_Reflector.Flags, m_Type, indexes.Select(i => i.Type).ToArray(), out info))
                {
                    throw new MemberAccessException("指定されたインデクサは存在しません");
                }
                Propertys.Add(key, info);
            }
            return(new IndexerReflector <T>(info, m_InstanceObject, indexes));
        }
        /// <summary>
        /// 指定された名前のプロパティへのアクセスを提供する<see cref="PropertyReflector{T}"/>を返します。
        /// </summary>
        /// <param name="name">プロパティの名前を表す文字列</param>
        /// <typeparam name="T">プロパティの型</typeparam>
        /// <returns></returns>
        /// <exception cref="System.MemberAccessException">指定されたプロパティは存在しません</exception>
        public PropertyReflector <T> Property <T>(string name)
        {
            PropertyInfo info = null;
            var          key  = name.GetHashCode();

            if (!Propertys.TryGetValue(key, out info))
            {
                if (!PropertyReflector <T> .TryGetPropertyInfo(m_Reflector.Flags, m_Type, name, out info))
                {
                    throw new MemberAccessException("指定されたプロパティは存在しません");
                }
                Propertys.Add(key, info);
            }
            return(new PropertyReflector <T>(info, m_InstanceObject));
        }
 public object GetValue(object ins, bool useProvider = true)
 {
     if (ins == null)
     {
         return(null);
     }
     if (ins.GetType().GetInterface(typeof(IEnumerable).FullName) != null)
     {
         var multiVals = new PropertyMultiValue();
         foreach (var objIns in (IEnumerable)ins)
         {
             PropertyDescriptor dicPro;
             if (Propertys.TryGetValue(objIns.GetType(), out dicPro))
             {
                 var val = _ProGetValue(dicPro, objIns, useProvider);
                 multiVals.Values.Add(val);
             }
             System.Reflection.FieldInfo field;
             if (Fields.TryGetValue(objIns.GetType(), out field))
             {
                 var val = _FieldGetValue(field, objIns, useProvider);
                 multiVals.Values.Add(val);
             }
         }
         return(multiVals.GetValue());
     }
     else
     {
         PropertyDescriptor dicPro;
         if (Propertys.TryGetValue(ins.GetType(), out dicPro))
         {
             return(_ProGetValue(dicPro, ins, useProvider));
         }
         System.Reflection.FieldInfo field;
         if (Fields.TryGetValue(ins.GetType(), out field))
         {
             return(_FieldGetValue(field, ins, useProvider));
         }
     }
     return(null);
 }
 public void SetValue(ref object ins, ref object value)
 {
     if (ins == null)
     {
         return;
     }
     if (ins.GetType().GetInterface(typeof(IEnumerable).FullName) != null)
     {
         foreach (var objIns in (IEnumerable)ins)
         {
             var obj = objIns;
             PropertyDescriptor dicPro;
             if (Propertys.TryGetValue(obj.GetType(), out dicPro))
             {
                 _ProSetValue(dicPro, ref obj, ref value);
             }
             System.Reflection.FieldInfo field;
             if (Fields.TryGetValue(ins.GetType(), out field))
             {
                 _FieldSetValue(field, ref obj, ref value);
             }
         }
     }
     else
     {
         PropertyDescriptor dicPro;
         if (Propertys.TryGetValue(ins.GetType(), out dicPro))
         {
             _ProSetValue(dicPro, ref ins, ref value);
         }
         System.Reflection.FieldInfo field;
         if (Fields.TryGetValue(ins.GetType(), out field))
         {
             _FieldSetValue(field, ref ins, ref value);
         }
     }
 }