有没有快速的方法可以将一些IDataReader映射到没有第三方库(如AutoMapper或ValueInjecter)的对象?
答案 0 :(得分:1)
当然,
class MyObject
{
public string SomeProperty { get; set; }
public MyObject(IDataReader reader)
{
SomeProperty = reader.GetString(0);
// - or -
SomeProperty = reader.GetString(reader.GetOrdinal("SomeProperty"));
// etc.
}
}
答案 1 :(得分:1)
我不太清楚你的意思,但你可以用反射把东西放在一起。您必须做出许多假设,例如所有对象的值都是通过属性设置的。并且,您的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;
}
}
不保证此代码将运行(我只是输入它而不是编译/测试它),但它至少可能是一个开始。
过去我做过这样的事情,并且很想把属性应用到我的属性,说明要映射到属性的数据读取器列。太多要包括在这里,但这只是一个启动器,希望是你正在寻找的。 p>
希望这有帮助!