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); } } }
/// <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); } } }