コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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
        }