Сопоставление IDataReader с объектом без сторонних библиотек

Есть ли быстрый способ сопоставить некоторые IDataReader с объектами без сторонних библиотек, таких как AutoMapper или ValueInjecter?


person Sawan    schedule 23.02.2011    source источник


Ответы (2)


Я не уверен, что вы подразумеваете под быстрым, но вы можете собрать что-то вместе, используя отражение. Вам придется сделать много предположений, например, все значения вашего объекта устанавливаются через свойства. И ваши столбцы DataReader ДОЛЖНЫ совпадать с именем свойства вашего объекта. Но вы могли бы сделать что-то вроде этого:

ПРИМЕЧАНИЕ. Функция SetProperty взята из статьи на DevX. (Это было в VB.NET, и я преобразовал его в C# — если есть ошибки, я, вероятно, что-то упустил.)

IList<MyObject> myObjList = new List<MyObject>();

while (reader.Read()){
  int fieldCount = reader.FieldCount;
  MyObject myObj = new MyObject();
  for(int i=0;i<fieldCount;i++){
    SetProperty(myObj, reader.GetName(i), reader.GetOrdinal(i));
  }
  myObjList.Add(myObj);
}

bool SetProperty(object obj, String propertyName, object val) {
    try {
        //get a reference to the PropertyInfo, exit if no property with that 
        //name
        System.Reflection.PropertyInfo pi = obj.GetType().GetProperty(propertyName);
        if (pi == null) then return false;
        //convert the value to the expected type
        val = Convert.ChangeType(val, pi.PropertyType);
        //attempt the assignment
        pi.SetValue(obj, val, null);
        return true;
    }
    catch {
        return false;
    }
}

Нет гарантий, что этот код будет работать (я просто набираю его, а не компилирую/тестирую), но, по крайней мере, это может быть началом.

Я делал подобные вещи в прошлом, и мне стало интересно применять атрибуты к своим свойствам, указывая, какой столбец чтения данных сопоставлять со свойством. Слишком много, чтобы включить сюда, но это только начало, и, надеюсь, это то, что вы ищете.

Надеюсь это поможет!

person David Hoerster    schedule 23.02.2011

Конечно,

class MyObject
{
    public string SomeProperty { get; set; }
    public MyObject(IDataReader reader)
    {
        SomeProperty = reader.GetString(0);
        // - or -
        SomeProperty = reader.GetString(reader.GetOrdinal("SomeProperty"));
        // etc.
    }
}
person Tergiver    schedule 23.02.2011
comment
Я предполагаю, что отрицательный голос был дан, потому что ответ очевиден? @MSS не заявил, что они рассмотрели и отвергли очевидное. Это не только правильный ответ, это ответ, который я использую в своих собственных проектах. Мне нравится тот факт, что это делает явным, какие объекты участвуют в сериализации базы данных. - person Tergiver; 24.02.2011