internal static ClassData Read(XmlReader xmlReader)
        {
            var classData = new ClassData();
            xmlReader.MoveToFirstAttribute();
            do
            {
                if (xmlReader.Name.Length > 0)
                {
                    switch (xmlReader.Name)
                    {
                        case ("typeName"):
                            {
                                classData.TypeName = xmlReader.Value;
                                break;
                            }
                        default:
                            {
                                throw new Exception(string.Format("Un-expected element while parsing xml. Element name='{0}'", xmlReader.Name));
                            }
                    }
                }
            } while (xmlReader.MoveToNextAttribute());
            while (xmlReader.Read())
            {
                if (xmlReader.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
                if (xmlReader.IsStartElement())
                {
                    switch (xmlReader.Name)
                {
                    case("method"):
                        {
                            var methodData = MethodData.Read(xmlReader);
                            classData.Methods.Add(methodData);
                            break;
                        }
                    case("property"):
                        {
                            var propertyData = PropertyData.Read(xmlReader);
                            classData.Properties.Add(propertyData);
                            break;
                        }
                    case("field"):
                        {
                            var fieldData = FieldData.Read(xmlReader);
                            classData.Fields.Add(fieldData);
                            break;
                        }
                    default:
                        {
                            throw new Exception(string.Format("Un-expected element while parsing xml. Element name='{0}'", xmlReader.Name));
                            }

                }}
            }
            xmlReader.Read();
                return classData;
        }
        private static void ProcessFields(ClassData classData, Type classType)
        {
            if ((classData.Fields != null) && (classData.Fields.Count > 0))
            {
                //var runtimeTypeHandle = classType.TypeHandle;
                var typeDescriptor = TypeCache.GetType(classType);
                for (var fieldIndex = 0; fieldIndex < classData.Fields.Count; fieldIndex++)
                {
					var fieldData = classData.Fields[fieldIndex];
                    FieldDescriptor fieldDescriptor;
                    if (!typeDescriptor.Fields.TryGetValue(fieldData.Name, out fieldDescriptor))
                    {
                        fieldDescriptor = typeDescriptor.GetOrCreateFieldDescriptor(fieldData.Name);
                    }
                    AddRuleToInfoDescriptor(fieldData.RuleDatas, fieldDescriptor);
                }
            }
        }
 private static void ProcessProperties(ClassData classData, Type classType)
 {
     if ((classData.Properties != null) && (classData.Properties.Count > 0))
     {
         //var runtimeTypeHandle = classType.TypeHandle;
         var typeDescriptor = TypeCache.GetType(classType);
         for (var propertyIndex = 0; propertyIndex < classData.Properties.Count; propertyIndex++)
         {
             var propertyData = classData.Properties[propertyIndex];
             PropertyDescriptor propertyDescriptor;
             if (!typeDescriptor.Properties.TryGetValue(propertyData.Name, out propertyDescriptor))
             {
                 propertyDescriptor = typeDescriptor.GetOrCreatePropertyDescriptor(propertyData.Name);
             }
             AddRuleToInfoDescriptor(propertyData.RuleDatas, propertyDescriptor);
         }
     }
 }
 private static void ProcessMethods(ClassData classData, Type classType)
 {
     if ((classData.Methods != null) && (classData.Methods.Count > 0))
     {
         for (var methodIndex = 0; methodIndex < classData.Methods.Count; methodIndex++)
         {
             var methodData = classData.Methods[methodIndex];
             MethodInfo methodInfo;
             if (methodData.OverloadTypes.Count == 0)
             {
                 methodInfo = classType.GetMethod(methodData.Name);
             }
             else
             {
                 var types = new Type[methodData.OverloadTypes.Count];
                 for (var overloadTypeIndex = 0; overloadTypeIndex < methodData.OverloadTypes.Count; overloadTypeIndex++)
                 {
                     var typeData = methodData.OverloadTypes[overloadTypeIndex];
                     types[overloadTypeIndex] = Type.GetType(typeData.TypeName, true);
                 }
                 methodInfo = classType.GetMethod(methodData.Name, types);
             }
             var methodDescriptor = MethodCache.GetMethod(methodInfo.MethodHandle);
             for (var parameterIndex = 0; parameterIndex < methodData.Parameters.Count; parameterIndex++)
             {
                 var parameterData = methodData.Parameters[parameterIndex];
                 var parameterDescriptor = methodDescriptor.Parameters[parameterData.Name];
                 AddRuleToInfoDescriptor(parameterData.RuleDatas, parameterDescriptor);
             }
         }
     }
 }