private static List <FieldInfoHandle> GetFieldInfos(Type objType) { string key = objType.FullName; List <FieldInfoHandle> ret = null; if (!_dicFieldInfo.TryGetValue(key, out ret)) { ret = new List <FieldInfoHandle>(); _dicFieldInfo[key] = ret; Type currentType = objType; while (currentType != null) { FieldInfo[] fInfos = currentType.GetFields(FastValueGetSet.AllBindingFlags); foreach (FieldInfo finfo in fInfos) { GetFieldValueHandle getHandle = FastFieldGetSet.GetGetValueHandle(finfo); SetFieldValueHandle setHandle = FastFieldGetSet.GetSetValueHandle(finfo); FieldInfoHandle handle = new FieldInfoHandle(objType, getHandle, setHandle, finfo.FieldType, finfo.Name, finfo); ret.Add(handle); } currentType = currentType.BaseType; if (currentType == typeof(object)) { break; } } } return(ret); }
/// <summary> /// 创建属性的信息类 /// </summary> /// <param name="belong">所属的实体</param> /// <param name="getHandle">get委托</param> /// <param name="setHandle">set委托</param> /// <param name="tableMappingAtt">映射标识类</param> /// <param name="fieldName">属性名</param> /// <param name="fieldType">属性类型</param> public EntityMappingInfo(Type belong, GetFieldValueHandle getHandle, SetFieldValueHandle setHandle, TableRelationAttribute mappingInfo, string fieldName, Type fieldType, FieldInfo belongFieldInfo, PropertyInfo belongPropertyInfo) : base(belong, getHandle, setHandle, fieldType, fieldName, belongFieldInfo) { this._mappingInfo = mappingInfo; this._belongPropertyInfo = belongPropertyInfo; }
/// <summary> /// 获取字段设置值的委托(带缓存) /// </summary> /// <param name="info">字段信息</param> /// <returns></returns> public static SetFieldValueHandle FindSetValueHandle(FieldInfo info) { SetFieldValueHandle ret = null; string key = FastValueGetSet.GetMethodInfoKey(info); if (!_dicSet.TryGetValue(key, out ret)) { ret = GetSetValueHandle(info); _dicSet[key] = ret; } return(ret); }
/// <summary> /// 创建属性的信息类 /// </summary> /// <param name="belong">字段所属的类类型</param> /// <param name="getHandle">get委托</param> /// <param name="setHandle">set委托</param> /// <param name="fieldType">字段数据类型</param> /// <param name="fieldName">字段名</param> /// <param name="belongFieldInfo">所属的字段反射信息</param> public FieldInfoHandle(Type belong, GetFieldValueHandle getHandle, SetFieldValueHandle setHandle, Type fieldType, string fieldName, FieldInfo belongFieldInfo) { this._getHandle = getHandle; this._setHandle = setHandle; this._fieldType = fieldType; this._fieldName = fieldName; this._belong = belong; this._belongFieldInfo = belongFieldInfo; LoadRealFieldType(); }
/// <summary> /// 初始化类型的属性信息 /// </summary> /// <param name="type">类型</param> /// <returns>如果已经初始化过侧返回false</returns> private static void InitClassPropertyInfos(Type type) { string fullName = type.FullName; //实例化本类型的句柄 CreateInstanceHandler createrHandel = FastValueGetSet.GetCreateInstanceHandlerWithOutCache(type); Dictionary <string, PropertyInfoHandle> dicPropertys = new Dictionary <string, PropertyInfoHandle>(); Dictionary <string, FieldInfoHandle> dicField = new Dictionary <string, FieldInfoHandle>(); //属性信息句柄 PropertyInfo[] destproper = type.GetProperties(FastValueGetSet.AllBindingFlags); FieldInfo[] allField = type.GetFields(FastValueGetSet.AllBindingFlags); //int index = 0; ///读取属性别名 foreach (PropertyInfo pinf in destproper) { ///通过属性来反射 string proName = pinf.Name; FastPropertyHandler getHandle = FastValueGetSet.GetGetMethodInfo(proName, type); FastPropertyHandler setHandle = FastValueGetSet.GetSetMethodInfo(proName, type); if (getHandle != null || setHandle != null) { PropertyInfoHandle classProperty = new PropertyInfoHandle(type, getHandle, setHandle, pinf.PropertyType, pinf.Name); dicPropertys.Add(pinf.Name, classProperty); } } ///读取属性别名 foreach (FieldInfo fInf in allField) { string proName = fInf.Name; GetFieldValueHandle getHandle = FastFieldGetSet.GetGetValueHandle(fInf); SetFieldValueHandle setHandle = FastFieldGetSet.GetSetValueHandle(fInf); if (getHandle != null || setHandle != null) { FieldInfoHandle fieldInfo = new FieldInfoHandle(type, getHandle, setHandle, fInf.FieldType, fInf.Name, fInf); dicField.Add(fInf.Name, fieldInfo); } } ClassInfoHandle classInfo = new ClassInfoHandle(type, createrHandel, dicPropertys, dicField); dicClass.Add(fullName, classInfo); }
/// <summary> /// 填充值 /// </summary> /// <param name="objType"></param> /// <param name="flags"></param> /// <param name="fillBase"></param> private static void FillFieldInfos(Type objType, BindingFlags flags, List <FieldInfoHandle> lstRet, Dictionary <string, bool> dicExists) { FieldInfo[] infos = objType.GetFields(flags); foreach (FieldInfo info in infos) { if (dicExists.ContainsKey(info.Name)) { continue; } GetFieldValueHandle getHandle = FastFieldGetSet.GetGetValueHandle(info); SetFieldValueHandle setHandle = FastFieldGetSet.GetSetValueHandle(info); FieldInfoHandle handle = new FieldInfoHandle(objType, getHandle, setHandle, info.FieldType, info.Name, info); lstRet.Add(handle); dicExists[info.Name] = true; } }
/// <summary> /// 创建属性的信息类 /// </summary> /// <param name="belong">所属的实体信息</param> /// <param name="getHandle">get委托</param> /// <param name="setHandle">set委托</param> /// <param name="ep">字段标识类</param> /// <param name="fieldType">字段类型</param> /// <param name="fieldName">字段名</param> /// <param name="sourceType">源字段类型</param> public EntityPropertyInfo(EntityInfoHandle belong, GetFieldValueHandle getHandle, SetFieldValueHandle setHandle, EntityParam paramInfo, Type fieldType, string fieldName, FieldInfo belongFieldInfo, PropertyInfo belongPropertyInfo) : base(belong.EntityType, getHandle, setHandle, fieldType, fieldName, belongFieldInfo) { paramInfo.SqlType = belong.DBInfo.CurrentDbAdapter.ToCurrentDbType(paramInfo.SqlType);//转换成本数据库支持的数据类型 this._paramInfo = paramInfo; _belong = belong; _belongPropertyInfo = belongPropertyInfo; }