Универсальный SqlDataReader для Object Mapper - PullRequest
4 голосов
/ 15 ноября 2011

Я пытаюсь построить универсальный преобразователь, который преобразует результаты SqlDataReader в объект класса.

Вот базовая структура моего кода:

public interface IObjectCore
    {
        //contains properties for each of my objects
    }

    public class ObjectMapper<T> where T : IObjectCore, new()
    {
        public List<T> MapReaderToObjectList(SqlDataReader reader)
        {
            var resultList = new List<T>();
            while (reader.Read())
            {
                var item = new T();
                Type t = item.GetType();
                foreach (PropertyInfo property in t.GetProperties())
                {
                    Type type = property.PropertyType;
                    string readerValue = string.Empty;

                    if (reader[property.Name] != DBNull.Value)
                    {
                        readerValue = reader[property.Name].ToString();
                    }

                    if (!string.IsNullOrEmpty(readerValue))
                    {
                        property.SetValue(property, readerValue.To(type), null);
                    }

                }
            }
            return resultList;
        }
    }

    public static class TypeCaster
    {
        public static object To(this string value, Type t)
        {
            return Convert.ChangeType(value, t);
        }
    }

ДляПо большей части это работает, но как только он пытается установить значение свойства, я получаю следующую ошибку:

Объект не соответствует типу цели

на линии, где у меня есть property.SetValue.

Я попробовал все, и я не вижу, что я могу делать неправильно.

Ответы [ 2 ]

4 голосов
/ 15 ноября 2011

Вы пытаетесь установить значение свойства, которое вы просматриваете в цикле, я думаю, что вы намереваетесь установить значение вновь созданного элемента, который у вас есть, потому что он будет соответствовать типу, который вы передаете, на основе item.GetType ()

var item = new T();
//other code
property.SetValue(item , readerValue.To(type), null);

вместо

property.SetValue(property, readerValue.To(type), null);

Также за комментарий , убедитесь, что у вас есть:

resultList.Add(item);
1 голос
/ 15 ноября 2011

Похоже, эта часть неверна:

property.SetValue(property, readerValue.To(type), null);

Вы уверены, что хотите применить SetValue, передав ему property? Похоже, вы должны передать объект типа T, который item.

Это становится:

property.SetValue(item, readerValue.To(type), null);

...