public DataRecordConverterTypeBuilder(DataRecordConverterSpec queryInfo) { _queryInfo = Verify.ArgumentNotNull(queryInfo, "queryInfo"); PropertyInfo[] properties = queryInfo.RecordType.GetProperties(); var propertyMap = new NameDictionary<PropertyInfo>(); var dataRecordMap = new NameDictionary<DataRecordFieldInfo>(); foreach (DataRecordFieldInfo field in queryInfo.Fields) { dataRecordMap.Add(field.FieldName, field); } foreach (PropertyInfo property in properties) { if (property.HasPublicSetter()) { propertyMap.Add(property.Name, property); } } foreach (DataRecordFieldInfo field in queryInfo.Fields) { var propertyList = new PropertyList(queryInfo.RecordType, field.FieldName); if (propertyList.HasErrors) { _errors.AddRange(propertyList.Errors); } else if (DataRecordConverterMethod.CanHandleConversion(field.FieldType, propertyList.PropertyType)) { _mapFieldToProperty.Add(field, propertyList); } else { _errors.Add(string.Format("Cannot convert from {0} to {1} for {2}", field.FieldType.Name, propertyList.PropertyType.Name, field.FieldName)); } } foreach (PropertyInfo property in properties) { if (property.HasPublicSetter()) { DataRecordFieldInfo field; if (dataRecordMap.TryGetValue(property.Name, out field)) { _mapPropertyToField.Add(property, field); } else { _errors.Add(string.Format("Query result does not have a column named '{0}'", property.Name)); } } } }