using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Text; 
 | 
using System.Reflection.Emit; 
 | 
using System.Reflection; 
 | 
using System.Collections; 
 | 
#if !SILVERLIGHT 
 | 
using System.Data; 
 | 
#endif 
 | 
using System.Collections.Specialized; 
 | 
  
 | 
namespace FastJSON 
 | 
{ 
 | 
    internal struct Getters 
 | 
    { 
 | 
        public string Name; 
 | 
        public string lcName; 
 | 
        //public string OtherName; 
 | 
        public Reflection.GenericGetter Getter; 
 | 
    } 
 | 
  
 | 
    internal enum myPropInfoType 
 | 
    { 
 | 
        Int, 
 | 
        Long, 
 | 
        String, 
 | 
        Bool, 
 | 
        DateTime, 
 | 
        Enum, 
 | 
        Guid, 
 | 
  
 | 
        Array, 
 | 
        ByteArray, 
 | 
        Dictionary, 
 | 
        StringKeyDictionary, 
 | 
        NameValue, 
 | 
        StringDictionary, 
 | 
#if !SILVERLIGHT 
 | 
        Hashtable, 
 | 
        DataSet, 
 | 
        DataTable, 
 | 
#endif 
 | 
        Custom, 
 | 
        Unknown, 
 | 
    } 
 | 
  
 | 
    internal struct myPropInfo 
 | 
    { 
 | 
        public Type pt; 
 | 
        public Type bt; 
 | 
        public Type changeType; 
 | 
        public Reflection.GenericSetter setter; 
 | 
        public Reflection.GenericGetter getter; 
 | 
        public Type[] GenericTypes; 
 | 
        public string Name; 
 | 
        public myPropInfoType Type; 
 | 
        public bool CanWrite; 
 | 
  
 | 
        public bool IsClass; 
 | 
        public bool IsValueType; 
 | 
        public bool IsGenericType; 
 | 
        public bool IsStruct; 
 | 
    } 
 | 
  
 | 
    internal sealed class Reflection 
 | 
    { 
 | 
        // Sinlgeton pattern 4 from : http://csharpindepth.com/articles/general/singleton.aspx 
 | 
        private static readonly Reflection instance = new Reflection(); 
 | 
        // Explicit static constructor to tell C# compiler 
 | 
        // not to mark type as beforefieldinit 
 | 
        static Reflection() 
 | 
        { 
 | 
        } 
 | 
        private Reflection() 
 | 
        { 
 | 
        } 
 | 
        public static Reflection Instance { get { return instance; } } 
 | 
  
 | 
        internal delegate object GenericSetter(object target, object value); 
 | 
        internal delegate object GenericGetter(object obj); 
 | 
        private delegate object CreateObject(); 
 | 
  
 | 
        private SafeDictionary<Type, string> _tyname = new SafeDictionary<Type, string>(); 
 | 
        private SafeDictionary<string, Type> _typecache = new SafeDictionary<string, Type>(); 
 | 
        private SafeDictionary<Type, CreateObject> _constrcache = new SafeDictionary<Type, CreateObject>(); 
 | 
        private SafeDictionary<Type, Getters[]> _getterscache = new SafeDictionary<Type, Getters[]>(); 
 | 
        private SafeDictionary<string, Dictionary<string, myPropInfo>> _propertycache = new SafeDictionary<string, Dictionary<string, myPropInfo>>(); 
 | 
        private SafeDictionary<Type, Type[]> _genericTypes = new SafeDictionary<Type, Type[]>(); 
 | 
        private SafeDictionary<Type, Type> _genericTypeDef = new SafeDictionary<Type, Type>(); 
 | 
  
 | 
        #region json custom types 
 | 
        // JSON custom 
 | 
        internal SafeDictionary<Type, Serialize> _customSerializer = new SafeDictionary<Type, Serialize>(); 
 | 
        internal SafeDictionary<Type, Deserialize> _customDeserializer = new SafeDictionary<Type, Deserialize>(); 
 | 
        internal object CreateCustom(string v, Type type) 
 | 
        { 
 | 
            Deserialize d; 
 | 
            _customDeserializer.TryGetValue(type, out d); 
 | 
            return d(v); 
 | 
        } 
 | 
  
 | 
        internal void RegisterCustomType(Type type, Serialize serializer, Deserialize deserializer) 
 | 
        { 
 | 
            if (type != null && serializer != null && deserializer != null) 
 | 
            { 
 | 
                _customSerializer.Add(type, serializer); 
 | 
                _customDeserializer.Add(type, deserializer); 
 | 
                // reset property cache 
 | 
                Reflection.Instance.ResetPropertyCache(); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        internal bool IsTypeRegistered(Type t) 
 | 
        { 
 | 
            if (_customSerializer.Count == 0) 
 | 
                return false; 
 | 
            Serialize s; 
 | 
            return _customSerializer.TryGetValue(t, out s); 
 | 
        } 
 | 
        #endregion 
 | 
  
 | 
        public Type GetGenericTypeDefinition(Type t) 
 | 
        { 
 | 
            Type tt = null; 
 | 
            if (_genericTypeDef.TryGetValue(t, out tt)) 
 | 
                return tt; 
 | 
            else 
 | 
            { 
 | 
                tt = t.GetGenericTypeDefinition(); 
 | 
                _genericTypeDef.Add(t, tt); 
 | 
                return tt; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public Type[] GetGenericArguments(Type t) 
 | 
        { 
 | 
            Type[] tt = null; 
 | 
            if (_genericTypes.TryGetValue(t, out tt)) 
 | 
                return tt; 
 | 
            else 
 | 
            { 
 | 
                tt = t.GetGenericArguments(); 
 | 
                _genericTypes.Add(t, tt); 
 | 
                return tt; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public Dictionary<string, myPropInfo> Getproperties(Type type, string typename, bool customType) 
 | 
        { 
 | 
            Dictionary<string, myPropInfo> sd = null; 
 | 
            if (_propertycache.TryGetValue(typename, out sd)) 
 | 
            { 
 | 
                return sd; 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                sd = new Dictionary<string, myPropInfo>(); 
 | 
                PropertyInfo[] pr = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); 
 | 
                foreach (PropertyInfo p in pr) 
 | 
                { 
 | 
                    if (p.GetIndexParameters().Length > 0) 
 | 
                    {// Property is an indexer 
 | 
                        continue; 
 | 
                    } 
 | 
                    myPropInfo d = CreateMyProp(p.PropertyType, p.Name, customType); 
 | 
                    d.setter = Reflection.CreateSetMethod(type, p); 
 | 
                    if (d.setter != null) 
 | 
                        d.CanWrite = true; 
 | 
                    d.getter = Reflection.CreateGetMethod(type, p); 
 | 
                    sd.Add(p.Name.ToLower(), d); 
 | 
                } 
 | 
                FieldInfo[] fi = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); 
 | 
                foreach (FieldInfo f in fi) 
 | 
                { 
 | 
                    myPropInfo d = CreateMyProp(f.FieldType, f.Name, customType); 
 | 
                    if (f.IsLiteral == false) 
 | 
                    { 
 | 
                        d.setter = Reflection.CreateSetField(type, f); 
 | 
                        if (d.setter != null) 
 | 
                            d.CanWrite = true; 
 | 
                        d.getter = Reflection.CreateGetField(type, f); 
 | 
                        sd.Add(f.Name.ToLower(), d); 
 | 
                    } 
 | 
                } 
 | 
  
 | 
                _propertycache.Add(typename, sd); 
 | 
                return sd; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        private myPropInfo CreateMyProp(Type t, string name, bool customType) 
 | 
        { 
 | 
            myPropInfo d = new myPropInfo(); 
 | 
            myPropInfoType d_type = myPropInfoType.Unknown; 
 | 
  
 | 
            if (t == typeof(int) || t == typeof(int?)) d_type = myPropInfoType.Int; 
 | 
            else if (t == typeof(long) || t == typeof(long?)) d_type = myPropInfoType.Long; 
 | 
            else if (t == typeof(string)) d_type = myPropInfoType.String; 
 | 
            else if (t == typeof(bool) || t == typeof(bool?)) d_type = myPropInfoType.Bool; 
 | 
            else if (t == typeof(DateTime) || t == typeof(DateTime?)) d_type = myPropInfoType.DateTime; 
 | 
            else if (t.IsEnum) d_type = myPropInfoType.Enum; 
 | 
            else if (t == typeof(Guid) || t == typeof(Guid?)) d_type = myPropInfoType.Guid; 
 | 
            else if (t == typeof(StringDictionary)) d_type = myPropInfoType.StringDictionary; 
 | 
            else if (t == typeof(NameValueCollection)) d_type = myPropInfoType.NameValue; 
 | 
            else if (t.IsArray) 
 | 
            { 
 | 
                d.bt = t.GetElementType(); 
 | 
                if (t == typeof(byte[])) 
 | 
                    d_type = myPropInfoType.ByteArray; 
 | 
                else 
 | 
                    d_type = myPropInfoType.Array; 
 | 
            } 
 | 
            else if (t.Name.Contains("Dictionary")) 
 | 
            { 
 | 
                d.GenericTypes = Reflection.Instance.GetGenericArguments(t);// t.GetGenericArguments(); 
 | 
                if (d.GenericTypes.Length > 0 && d.GenericTypes[0] == typeof(string)) 
 | 
                    d_type = myPropInfoType.StringKeyDictionary; 
 | 
                else 
 | 
                    d_type = myPropInfoType.Dictionary; 
 | 
            } 
 | 
#if !SILVERLIGHT 
 | 
            else if (t == typeof(Hashtable)) d_type = myPropInfoType.Hashtable; 
 | 
            else if (t == typeof(DataSet)) d_type = myPropInfoType.DataSet; 
 | 
            else if (t == typeof(DataTable)) d_type = myPropInfoType.DataTable; 
 | 
#endif 
 | 
            else if (customType) 
 | 
                d_type = myPropInfoType.Custom; 
 | 
  
 | 
            if (t.IsValueType && !t.IsPrimitive && !t.IsEnum && t != typeof(decimal)) 
 | 
                d.IsStruct = true; 
 | 
  
 | 
            d.IsClass = t.IsClass; 
 | 
            d.IsValueType = t.IsValueType; 
 | 
            if (t.IsGenericType) 
 | 
            { 
 | 
                d.IsGenericType = true; 
 | 
                d.bt = t.GetGenericArguments()[0]; 
 | 
            } 
 | 
  
 | 
            d.pt = t; 
 | 
            d.Name = name; 
 | 
            d.changeType = GetChangeType(t); 
 | 
            d.Type = d_type; 
 | 
  
 | 
            return d; 
 | 
        } 
 | 
  
 | 
        private Type GetChangeType(Type conversionType) 
 | 
        { 
 | 
            if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 
 | 
                return Reflection.Instance.GetGenericArguments(conversionType)[0];// conversionType.GetGenericArguments()[0]; 
 | 
  
 | 
            return conversionType; 
 | 
        } 
 | 
  
 | 
        #region [   PROPERTY GET SET   ] 
 | 
  
 | 
        internal string GetTypeAssemblyName(Type t) 
 | 
        { 
 | 
            string val = ""; 
 | 
            if (_tyname.TryGetValue(t, out val)) 
 | 
                return val; 
 | 
            else 
 | 
            { 
 | 
                string s = t.AssemblyQualifiedName; 
 | 
                _tyname.Add(t, s); 
 | 
                return s; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        internal Type GetTypeFromCache(string typename) 
 | 
        { 
 | 
            Type val = null; 
 | 
            if (_typecache.TryGetValue(typename, out val)) 
 | 
                return val; 
 | 
            else 
 | 
            { 
 | 
                Type t = Type.GetType(typename); 
 | 
                //if (t == null) // RaptorDB : loading runtime assemblies 
 | 
                //{ 
 | 
                //    t = Type.GetType(typename, (name) => { 
 | 
                //        return AppDomain.CurrentDomain.GetAssemblies().Where(z => z.FullName == name.FullName).FirstOrDefault(); 
 | 
                //    }, null, true); 
 | 
                //} 
 | 
                _typecache.Add(typename, t); 
 | 
                return t; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        internal object FastCreateInstance(Type objtype) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                CreateObject c = null; 
 | 
                if (_constrcache.TryGetValue(objtype, out c)) 
 | 
                { 
 | 
                    return c(); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    if (objtype.IsClass) 
 | 
                    { 
 | 
                        DynamicMethod dynMethod = new DynamicMethod("_", objtype, null); 
 | 
                        ILGenerator ilGen = dynMethod.GetILGenerator(); 
 | 
                        ilGen.Emit(OpCodes.Newobj, objtype.GetConstructor(Type.EmptyTypes)); 
 | 
                        ilGen.Emit(OpCodes.Ret); 
 | 
                        c = (CreateObject)dynMethod.CreateDelegate(typeof(CreateObject)); 
 | 
                        _constrcache.Add(objtype, c); 
 | 
                    } 
 | 
                    else // structs 
 | 
                    { 
 | 
                        DynamicMethod dynMethod = new DynamicMethod("_", typeof(object), null); 
 | 
                        ILGenerator ilGen = dynMethod.GetILGenerator(); 
 | 
                        var lv = ilGen.DeclareLocal(objtype); 
 | 
                        ilGen.Emit(OpCodes.Ldloca_S, lv); 
 | 
                        ilGen.Emit(OpCodes.Initobj, objtype); 
 | 
                        ilGen.Emit(OpCodes.Ldloc_0); 
 | 
                        ilGen.Emit(OpCodes.Box, objtype); 
 | 
                        ilGen.Emit(OpCodes.Ret); 
 | 
                        c = (CreateObject)dynMethod.CreateDelegate(typeof(CreateObject)); 
 | 
                        _constrcache.Add(objtype, c); 
 | 
                    } 
 | 
                    return c(); 
 | 
                } 
 | 
            } 
 | 
            catch (Exception exc) 
 | 
            { 
 | 
                throw new Exception(string.Format("Failed to fast create instance for type '{0}' from assembly '{1}'", 
 | 
                    objtype.FullName, objtype.AssemblyQualifiedName), exc); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        internal static GenericSetter CreateSetField(Type type, FieldInfo fieldInfo) 
 | 
        { 
 | 
            Type[] arguments = new Type[2]; 
 | 
            arguments[0] = arguments[1] = typeof(object); 
 | 
  
 | 
            DynamicMethod dynamicSet = new DynamicMethod("_", typeof(object), arguments, type); 
 | 
  
 | 
            ILGenerator il = dynamicSet.GetILGenerator(); 
 | 
  
 | 
            if (!type.IsClass) // structs 
 | 
            { 
 | 
                var lv = il.DeclareLocal(type); 
 | 
                il.Emit(OpCodes.Ldarg_0); 
 | 
                il.Emit(OpCodes.Unbox_Any, type); 
 | 
                il.Emit(OpCodes.Stloc_0); 
 | 
                il.Emit(OpCodes.Ldloca_S, lv); 
 | 
                il.Emit(OpCodes.Ldarg_1); 
 | 
                if (fieldInfo.FieldType.IsClass) 
 | 
                    il.Emit(OpCodes.Castclass, fieldInfo.FieldType); 
 | 
                else 
 | 
                    il.Emit(OpCodes.Unbox_Any, fieldInfo.FieldType); 
 | 
                il.Emit(OpCodes.Stfld, fieldInfo); 
 | 
                il.Emit(OpCodes.Ldloc_0); 
 | 
                il.Emit(OpCodes.Box, type); 
 | 
                il.Emit(OpCodes.Ret); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                il.Emit(OpCodes.Ldarg_0); 
 | 
                il.Emit(OpCodes.Ldarg_1); 
 | 
                if (fieldInfo.FieldType.IsValueType) 
 | 
                    il.Emit(OpCodes.Unbox_Any, fieldInfo.FieldType); 
 | 
                il.Emit(OpCodes.Stfld, fieldInfo); 
 | 
                il.Emit(OpCodes.Ldarg_0); 
 | 
                il.Emit(OpCodes.Ret); 
 | 
            } 
 | 
            return (GenericSetter)dynamicSet.CreateDelegate(typeof(GenericSetter)); 
 | 
        } 
 | 
  
 | 
        internal static GenericSetter CreateSetMethod(Type type, PropertyInfo propertyInfo) 
 | 
        { 
 | 
            MethodInfo setMethod = propertyInfo.GetSetMethod(); 
 | 
            if (setMethod == null) 
 | 
                return null; 
 | 
  
 | 
            Type[] arguments = new Type[2]; 
 | 
            arguments[0] = arguments[1] = typeof(object); 
 | 
  
 | 
            DynamicMethod setter = new DynamicMethod("_", typeof(object), arguments); 
 | 
            ILGenerator il = setter.GetILGenerator(); 
 | 
  
 | 
            if (!type.IsClass) // structs 
 | 
            { 
 | 
                var lv = il.DeclareLocal(type); 
 | 
                il.Emit(OpCodes.Ldarg_0); 
 | 
                il.Emit(OpCodes.Unbox_Any, type); 
 | 
                il.Emit(OpCodes.Stloc_0); 
 | 
                il.Emit(OpCodes.Ldloca_S, lv); 
 | 
                il.Emit(OpCodes.Ldarg_1); 
 | 
                if (propertyInfo.PropertyType.IsClass) 
 | 
                    il.Emit(OpCodes.Castclass, propertyInfo.PropertyType); 
 | 
                else 
 | 
                    il.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType); 
 | 
                il.EmitCall(OpCodes.Call, setMethod, null); 
 | 
                il.Emit(OpCodes.Ldloc_0); 
 | 
                il.Emit(OpCodes.Box, type); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                if (!setMethod.IsStatic) 
 | 
                { 
 | 
                    il.Emit(OpCodes.Ldarg_0); 
 | 
                    il.Emit(OpCodes.Castclass, propertyInfo.DeclaringType); 
 | 
                    il.Emit(OpCodes.Ldarg_1); 
 | 
                    if (propertyInfo.PropertyType.IsClass) 
 | 
                        il.Emit(OpCodes.Castclass, propertyInfo.PropertyType); 
 | 
                    else 
 | 
                        il.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType); 
 | 
                    il.EmitCall(OpCodes.Callvirt, setMethod, null); 
 | 
                    il.Emit(OpCodes.Ldarg_0); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    il.Emit(OpCodes.Ldarg_0); 
 | 
                    il.Emit(OpCodes.Ldarg_1); 
 | 
                    if (propertyInfo.PropertyType.IsClass) 
 | 
                        il.Emit(OpCodes.Castclass, propertyInfo.PropertyType); 
 | 
                    else 
 | 
                        il.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType); 
 | 
                    il.Emit(OpCodes.Call, setMethod); 
 | 
                } 
 | 
            } 
 | 
  
 | 
            il.Emit(OpCodes.Ret); 
 | 
  
 | 
            return (GenericSetter)setter.CreateDelegate(typeof(GenericSetter)); 
 | 
        } 
 | 
  
 | 
        internal static GenericGetter CreateGetField(Type type, FieldInfo fieldInfo) 
 | 
        { 
 | 
            DynamicMethod dynamicGet = new DynamicMethod("_", typeof(object), new Type[] { typeof(object) }, type); 
 | 
  
 | 
            ILGenerator il = dynamicGet.GetILGenerator(); 
 | 
  
 | 
            if (!type.IsClass) // structs 
 | 
            { 
 | 
                var lv = il.DeclareLocal(type); 
 | 
                il.Emit(OpCodes.Ldarg_0); 
 | 
                il.Emit(OpCodes.Unbox_Any, type); 
 | 
                il.Emit(OpCodes.Stloc_0); 
 | 
                il.Emit(OpCodes.Ldloca_S, lv); 
 | 
                il.Emit(OpCodes.Ldfld, fieldInfo); 
 | 
                if (fieldInfo.FieldType.IsValueType) 
 | 
                    il.Emit(OpCodes.Box, fieldInfo.FieldType); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                il.Emit(OpCodes.Ldarg_0); 
 | 
                il.Emit(OpCodes.Ldfld, fieldInfo); 
 | 
                if (fieldInfo.FieldType.IsValueType) 
 | 
                    il.Emit(OpCodes.Box, fieldInfo.FieldType); 
 | 
            } 
 | 
  
 | 
            il.Emit(OpCodes.Ret); 
 | 
  
 | 
            return (GenericGetter)dynamicGet.CreateDelegate(typeof(GenericGetter)); 
 | 
        } 
 | 
  
 | 
        internal static GenericGetter CreateGetMethod(Type type, PropertyInfo propertyInfo) 
 | 
        { 
 | 
            MethodInfo getMethod = propertyInfo.GetGetMethod(); 
 | 
            if (getMethod == null) 
 | 
                return null; 
 | 
  
 | 
            DynamicMethod getter = new DynamicMethod("_", typeof(object), new Type[] { typeof(object) }, type); 
 | 
  
 | 
            ILGenerator il = getter.GetILGenerator(); 
 | 
  
 | 
            if (!type.IsClass) // structs 
 | 
            { 
 | 
                var lv = il.DeclareLocal(type); 
 | 
                il.Emit(OpCodes.Ldarg_0); 
 | 
                il.Emit(OpCodes.Unbox_Any, type); 
 | 
                il.Emit(OpCodes.Stloc_0); 
 | 
                il.Emit(OpCodes.Ldloca_S, lv); 
 | 
                il.EmitCall(OpCodes.Call, getMethod, null); 
 | 
                if (propertyInfo.PropertyType.IsValueType) 
 | 
                    il.Emit(OpCodes.Box, propertyInfo.PropertyType); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                if (!getMethod.IsStatic) 
 | 
                { 
 | 
                    il.Emit(OpCodes.Ldarg_0); 
 | 
                    il.Emit(OpCodes.Castclass, propertyInfo.DeclaringType); 
 | 
                    il.EmitCall(OpCodes.Callvirt, getMethod, null); 
 | 
                } 
 | 
                else 
 | 
                    il.Emit(OpCodes.Call, getMethod); 
 | 
  
 | 
                if (propertyInfo.PropertyType.IsValueType) 
 | 
                    il.Emit(OpCodes.Box, propertyInfo.PropertyType); 
 | 
            } 
 | 
  
 | 
            il.Emit(OpCodes.Ret); 
 | 
  
 | 
            return (GenericGetter)getter.CreateDelegate(typeof(GenericGetter)); 
 | 
        } 
 | 
  
 | 
        internal Getters[] GetGetters(Type type, bool ShowReadOnlyProperties, List<Type> IgnoreAttributes)//JSONParameters param) 
 | 
        { 
 | 
            Getters[] val = null; 
 | 
            if (_getterscache.TryGetValue(type, out val)) 
 | 
                return val; 
 | 
  
 | 
            PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); 
 | 
            List<Getters> getters = new List<Getters>(); 
 | 
            foreach (PropertyInfo p in props) 
 | 
            { 
 | 
                if (p.GetIndexParameters().Length > 0) 
 | 
                {// Property is an indexer 
 | 
                    continue; 
 | 
                } 
 | 
                if (!p.CanWrite && ShowReadOnlyProperties == false) continue; 
 | 
                if (IgnoreAttributes != null) 
 | 
                { 
 | 
                    bool found = false; 
 | 
                    foreach (var ignoreAttr in IgnoreAttributes) 
 | 
                    { 
 | 
                        if (p.IsDefined(ignoreAttr, false)) 
 | 
                        { 
 | 
                            found = true; 
 | 
                            break; 
 | 
                        } 
 | 
                    } 
 | 
                    if (found) 
 | 
                        continue; 
 | 
                } 
 | 
                GenericGetter g = CreateGetMethod(type, p); 
 | 
                if (g != null) 
 | 
                    getters.Add(new Getters { Getter = g, Name = p.Name, lcName = p.Name.ToLower() }); 
 | 
            } 
 | 
  
 | 
            FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static); 
 | 
            foreach (var f in fi) 
 | 
            { 
 | 
                if (IgnoreAttributes != null) 
 | 
                { 
 | 
                    bool found = false; 
 | 
                    foreach (var ignoreAttr in IgnoreAttributes) 
 | 
                    { 
 | 
                        if (f.IsDefined(ignoreAttr, false)) 
 | 
                        { 
 | 
                            found = true; 
 | 
                            break; 
 | 
                        } 
 | 
                    } 
 | 
                    if (found) 
 | 
                        continue; 
 | 
                } 
 | 
                if (f.IsLiteral == false) 
 | 
                { 
 | 
                    GenericGetter g = CreateGetField(type, f); 
 | 
                    if (g != null) 
 | 
                        getters.Add(new Getters { Getter = g, Name = f.Name, lcName = f.Name.ToLower() }); 
 | 
                } 
 | 
            } 
 | 
            val = getters.ToArray(); 
 | 
            _getterscache.Add(type, val); 
 | 
            return val; 
 | 
        } 
 | 
  
 | 
        #endregion 
 | 
  
 | 
        internal void ResetPropertyCache() 
 | 
        { 
 | 
            _propertycache = new SafeDictionary<string, Dictionary<string, myPropInfo>>(); 
 | 
        } 
 | 
  
 | 
        internal void ClearReflectionCache() 
 | 
        { 
 | 
            _tyname = new SafeDictionary<Type, string>(); 
 | 
            _typecache = new SafeDictionary<string, Type>(); 
 | 
            _constrcache = new SafeDictionary<Type, CreateObject>(); 
 | 
            _getterscache = new SafeDictionary<Type, Getters[]>(); 
 | 
            _propertycache = new SafeDictionary<string, Dictionary<string, myPropInfo>>(); 
 | 
            _genericTypes = new SafeDictionary<Type, Type[]>(); 
 | 
            _genericTypeDef = new SafeDictionary<Type, Type>(); 
 | 
        } 
 | 
    } 
 | 
} 
 |