protected T ParseNode <T>(XContainer node) where T : new() { var properties = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); T rtn = ObjectCreator <T> .Instance.Create(Type.EmptyTypes, null); foreach (var property in properties) { if (property.PropertyType.IsGenericType) { XmlParseInfoAttribute parseInfo = XmlParseInfoAttribute.GetAttribute(property); if (parseInfo == null) { throw new Exception(string.Format("{1}.{0}未定义XmlParseInfoAttribute", property.Name, property.DeclaringType.Name)); } else { var value = ParseList(property.PropertyType, node, parseInfo.NodeName, parseInfo.ChildNodeName); FastReflection.SetPropertyValue <object>(rtn, property, value); } } else { string valueStr = ReadValueStr(node, property.Name); if (!string.IsNullOrEmpty(valueStr)) { if (property.PropertyType == typeof(string)) { FastReflection <T> .SetPropertyValue <string>(rtn, property, valueStr); } else if (property.PropertyType == typeof(Int32)) { int value = DataHelper.TryParseInt32(valueStr); FastReflection <T> .SetPropertyValue <Int32>(rtn, property, value); } else if (property.PropertyType == typeof(Int64)) { Int64 value = DataHelper.TryParseInt64(valueStr); FastReflection <T> .SetPropertyValue <Int64>(rtn, property, value); } else if (property.PropertyType == typeof(Double)) { Double value = DataHelper.TryParseDouble(valueStr); FastReflection <T> .SetPropertyValue <Double>(rtn, property, value); } else if (property.PropertyType == typeof(Decimal)) { Decimal value = DataHelper.TryParseDecimal(valueStr); FastReflection <T> .SetPropertyValue <Decimal>(rtn, property, value); } else if (property.PropertyType == typeof(Boolean)) { Boolean value = DataHelper.TryParseBoolean(valueStr); FastReflection <T> .SetPropertyValue <Boolean>(rtn, property, value); } else if (property.PropertyType.IsEnum) { int value = DataHelper.TryParseInt32(valueStr); if (Enum.IsDefined(property.PropertyType, value)) { FastReflection <T> .SetPropertyValue <object>(rtn, property, value); } } } } } return(rtn); }
protected object ParseNode(Type returnType, XContainer node) { if (returnType.IsEnum) { string valueStr = (node as XElement).Value; int value = 0; if (!string.IsNullOrEmpty(valueStr)) { value = DataHelper.TryParseInt32(valueStr); } return(value); } else { var properties = returnType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); object rtn = ObjectCreator.Create(returnType, Type.EmptyTypes, null); foreach (var property in properties) { string valueStr = ReadValueStr(node, property.Name); if (!string.IsNullOrEmpty(valueStr)) { if (property.PropertyType == typeof(string)) { FastReflection.SetPropertyValue <string>(rtn, property, valueStr); } else if (property.PropertyType == typeof(Int32)) { int value = DataHelper.TryParseInt32(valueStr); FastReflection.SetPropertyValue <Int32>(rtn, property, value); } else if (property.PropertyType == typeof(Int64)) { Int64 value = DataHelper.TryParseInt64(valueStr); FastReflection.SetPropertyValue <Int64>(rtn, property, value); } else if (property.PropertyType == typeof(Double)) { Double value = DataHelper.TryParseDouble(valueStr); FastReflection.SetPropertyValue <Double>(rtn, property, value); } else if (property.PropertyType == typeof(Decimal)) { Decimal value = DataHelper.TryParseDecimal(valueStr); FastReflection.SetPropertyValue <Decimal>(rtn, property, value); } else if (property.PropertyType == typeof(Boolean)) { Boolean value = DataHelper.TryParseBoolean(valueStr); FastReflection.SetPropertyValue <Boolean>(rtn, property, value); } else if (property.PropertyType.IsEnum) { int value = DataHelper.TryParseInt32(valueStr); if (Enum.IsDefined(property.PropertyType, value)) { FastReflection.SetPropertyValue <object>(rtn, property, value); } } } else if (property.PropertyType.IsGenericType) { XmlParseInfoAttribute parseInfo = XmlParseInfoAttribute.GetAttribute(property); var value = ParseList(property.PropertyType, node, parseInfo.NodeName, parseInfo.ChildNodeName); FastReflection.SetPropertyValue <object>(rtn, property, value); } } return(rtn); } }