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 void SetPropertyValue(object obj, Type type, string propertyName, object value)
        {
#if NET2
            if (value == null)
            {
                SetPropertyValueReflection(obj, propertyName, value);
            }
            else
            {
                string          key    = obj.GetType().Name + "." + propertyName;
                FastFieldSetter setter = (FastFieldSetter)fastFieldSetterLookup[key];
                if (setter == null)
                {
                    FieldInfo fieldInfo = GetFieldInfo(obj, propertyName);
                    setter = FastFieldAccess.GetFieldSetter(fieldInfo);
                    fastFieldSetterLookup[key] = setter;
                }

                setter(obj, value);
            }
#else
            SetPropertyValueReflection(obj, propertyName, value);
#endif
        }