Есть ли быстрый способ сопоставить некоторые IDataReader с объектами без сторонних библиотек, таких как AutoMapper или ValueInjecter?
Сопоставление IDataReader с объектом без сторонних библиотек
Ответы (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;
}
}
Нет гарантий, что этот код будет работать (я просто набираю его, а не компилирую/тестирую), но, по крайней мере, это может быть началом.
Я делал подобные вещи в прошлом, и мне стало интересно применять атрибуты к своим свойствам, указывая, какой столбец чтения данных сопоставлять со свойством. Слишком много, чтобы включить сюда, но это только начало, и, надеюсь, это то, что вы ищете.
Надеюсь это поможет!
Конечно,
class MyObject
{
public string SomeProperty { get; set; }
public MyObject(IDataReader reader)
{
SomeProperty = reader.GetString(0);
// - or -
SomeProperty = reader.GetString(reader.GetOrdinal("SomeProperty"));
// etc.
}
}