Отображение IDataReader на объект без сторонних библиотек - PullRequest
1 голос
/ 23 февраля 2011

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

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

Я не уверен, что вы подразумеваете под быстрым, но вы можете собрать что-то вместе, используя отражение.Вам нужно сделать много предположений, например, все значения вашего объекта задаются через свойства.И ваши столбцы 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;
    }
}

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

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

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

1 голос
/ 23 февраля 2011

Конечно,

class MyObject
{
    public string SomeProperty { get; set; }
    public MyObject(IDataReader reader)
    {
        SomeProperty = reader.GetString(0);
        // - or -
        SomeProperty = reader.GetString(reader.GetOrdinal("SomeProperty"));
        // etc.
    }
}
...