/// <summary> /// Get raw value by CSVColumnAttribute or name /// </summary> /// <param name="attribute"></param> /// <param name="fields"></param> /// <param name="keys"></param> /// <param name="name"></param> /// <returns></returns> private string GetRawValue(CSVColumnAttribute attribute, List <string> fields, List <string> keys, string name) { if (attribute.Column >= 0 && fields.Count > attribute.Column) { return(fields[attribute.Column]); } if (!string.IsNullOrEmpty(attribute.Key) && keys.Contains(attribute.Key)) { return(fields[keys.IndexOf(attribute.Key)]); } if (keys.Contains(name)) { return(fields[keys.IndexOf(name)]); } ZDebug.LogError(string.Format("Mapping Error! Column: {0}, Key: {1}, Name:{2}", attribute.Column, attribute.Key ?? "NULL", name)); return(name); }
/// <summary> /// Decode single row /// </summary> /// <typeparam name="T"></typeparam> /// <param name="fields"></param> /// <param name="keys"></param> /// <returns></returns> private T DecodeRow <T>(List <string> fields, List <string> keys) where T : new() { T result = new T(); IEnumerable <MemberInfo> members = typeof(T).GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .Where(m => m.MemberType == MemberTypes.Property || m.MemberType == MemberTypes.Field) .Where(m => Attribute.IsDefined(m, typeof(CSVColumnAttribute), false)); if (typeof(T).IsValueType) { object boxed = result; foreach (MemberInfo member in members) { CSVColumnAttribute attribute = member.GetCustomAttributes(typeof(CSVColumnAttribute), false).First() as CSVColumnAttribute; string field = GetRawValue(attribute, fields, keys, member.Name); if (ReferenceEquals(field, member.Name)) { return(result); } SetValue(member, boxed, field, attribute.DefaultValue, attribute.ArraySeparator, attribute.TrueValues); } return((T)boxed); } foreach (MemberInfo member in members) { CSVColumnAttribute attribute = member.GetCustomAttributes(typeof(CSVColumnAttribute), false).First() as CSVColumnAttribute; string field = GetRawValue(attribute, fields, keys, member.Name); if (ReferenceEquals(field, member.Name)) { return(result); } SetValue(member, result, field, attribute.DefaultValue, attribute.ArraySeparator, attribute.TrueValues); } return(result); }