Сопоставить RowDataCollection с DTO с помощью AutoMapper - PullRequest
1 голос
/ 21 января 2011

Есть ли способ сопоставить RowDataCollection с DTO , используя AutoMapper ?

Вот сценарий: DataRow to Object

user.UserId = row["UserId"];
user.UserName = row["UserName"];

Ответы [ 2 ]

2 голосов
/ 29 января 2011

конфигурация glbal.asax

    Mapper.CreateMap<DataRow, EventCompactViewModel>()
      .ConvertUsing(x => (EventCompactViewModel)AutomapperExtensions.DataRowMapper(x, typeof(EventCompactViewModel), null));

Картограф строки данных

public static object DataRowMapper(DataRow dataRow, Type type, string prefix)
{
    try
    {
        var returnObject = Activator.CreateInstance(type);

        foreach (var property in type.GetProperties())
        {
            foreach (DataColumn key in dataRow.Table.Columns)
            {
                string columnName = key.ColumnName;
                if (!String.IsNullOrEmpty(dataRow[columnName].ToString()))
                {
                    if (String.IsNullOrEmpty(prefix) || columnName.Length > prefix.Length)
                    {
                        String propertyNameToMatch = String.IsNullOrEmpty(prefix) ? columnName : columnName.Substring(property.Name.IndexOf(prefix) + prefix.Length + 1);
                        propertyNameToMatch = propertyNameToMatch.ToPascalCase();
                        if (property.Name == propertyNameToMatch)
                        {

                            Type t = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;

                            object safeValue = (dataRow[columnName] == null) ? null : Convert.ChangeType(dataRow[columnName], t);

                            property.SetValue(returnObject, safeValue, null);
                        }
                    }
                }
            }
        }

        return returnObject;
    }
    catch (MissingMethodException)
    {
        return null;
    }
}
0 голосов
/ 22 января 2011

Вы можете сделать пользовательский конвертер типов . И, если вы уверены, что имена свойств DTO будут точно совпадать с именами столбцов DataRow, вы, вероятно, могли бы немного подумать и иметь конвертер одного типа.

...