//获取一个设置特定字段的值的委托 /// <summary> /// 获取一个设置特定字段的值的委托 /// <para>返回结果: /// </para>一个void ReflectSet(object obj, object value)类型的委托 /// </summary> /// <param name="classType">需要设置字段的类</param> /// <param name="fieldName">字段名称</param> public static ReflectSet SetFieldValue(Type classType, string fieldName) { ReflectSet returnDelegate; string cacheKey = classType.FullName + SPACE + fieldName; if (cacheSet.TryGetValue(cacheKey, out returnDelegate)) { return(returnDelegate); } ReflectSet reflectSet = null; returnDelegate = delegate(object obj, object value) { reflectSet(obj, value); }; cacheSet.Add(cacheKey, returnDelegate); FieldInfo fieldInfo = classType.GetField(fieldName, EasyIL.ALLATTR); //获得属性对象FieldInfo reflectSet = delegate(object obj, object value) { fieldInfo.SetValue(obj, value); }; ThreadPool.QueueUserWorkItem(delegate(object o) { Type argType = typeof(object); EasyIL il = new EasyIL(null, classType.Module, argType, argType); ILField objField = il.CreateField(fieldInfo, il["0"]);//根据对象和属性对象 创建IL参数 objField.SetValue(il["1"].StValue()); il.Return(); reflectSet = (ReflectSet)il.CreateDelegate(typeof(ReflectSet)); }); return(returnDelegate); }
//获取一个获取特定字段的值的委托 /// <summary> /// 获取一个获取特定字段的值的委托 /// <para>返回结果: /// </para>一个object ReflectGet(object obj)类型的委托 /// </summary> /// <param name="classType">需要获取字段的类</param> /// <param name="fieldName">字段名称</param> public static ReflectGet GetFieldValue(Type classType, string fieldName) { ReflectGet returnDelegate; string cacheKey = classType.FullName + SPACE + fieldName; if (cacheGet.TryGetValue(cacheKey, out returnDelegate)) { return(returnDelegate); } cacheGet.Add(cacheKey, returnDelegate); FieldInfo fieldInfo = classType.GetField(fieldName, EasyIL.ALLATTR); ReflectGet reflectGet = delegate(object obj) { return(fieldInfo.GetValue(obj)); }; ThreadPool.QueueUserWorkItem(delegate(object o) { Type returnType = typeof(object); Type argType = typeof(object); EasyIL il = new EasyIL(returnType, classType.Module, argType); ILField objfield = il.CreateField(fieldInfo, il["0"]); il.Return(objfield); reflectGet = (ReflectGet)il.CreateDelegate(typeof(ReflectGet)); }); returnDelegate = delegate(object obj) { return(reflectGet(obj)); }; return(returnDelegate); }