public static FastFieldGetter GetFieldGetter(FieldInfo fieldInfo) { FastFieldGetter res; if (getterCache.TryGetValue(fieldInfo, out res)) { return(res); } lock (getterCache) { DynamicMethod dynamicMethod = new DynamicMethod(string.Empty, typeof(object), new Type[] { typeof(object) }, fieldInfo.DeclaringType, true); ILGenerator il = dynamicMethod.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldfld, fieldInfo); if (fieldInfo.FieldType.IsValueType) { il.Emit(OpCodes.Box, fieldInfo.FieldType); } il.Emit(OpCodes.Ret); FastFieldGetter invoker = (FastFieldGetter)dynamicMethod.CreateDelegate(typeof(FastFieldGetter)); getterCache[fieldInfo] = invoker; return(invoker); } }
private FastFieldGetter GetFastGetter(object obj, string propertyName) { string key = obj.GetType().Name + "." + propertyName; FastFieldGetter res = (FastFieldGetter)fastFieldGetterLookup[key]; if (res == null) { FieldInfo fieldInfo = GetFieldInfo(obj, propertyName); res = FastFieldAccess.GetFieldGetter(fieldInfo); fastFieldGetterLookup[key] = res; } return(res); }
public virtual object GetPropertyValue(object obj, Type type, string propertyName) { #if NET2 FastFieldGetter getter = GetFastGetter(obj, propertyName); return(getter(obj)); #else FieldInfo fieldInfo = (FieldInfo)propertyLookup[obj.GetType().Name + "." + propertyName]; if (fieldInfo == null) { fieldInfo = GetFieldInfo(obj, propertyName); } return(fieldInfo.GetValue(obj)); #endif }