1

没有第三方库(例如 AutoMapper 或 ValueInjecter),是否有任何快速方法可以将某些 IDataReader 映射到对象?

4

2 回答 2

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;
    }
}

不能保证这段代码会运行(我只是输入它而不是编译/测试它),但它至少可能是一个开始。

我过去做过类似的事情,并且喜欢将属性应用于我的属性,说明要映射到属性的数据读取器列。这里包含的内容太多,但这只是一个开始,希望是您正在寻找的。

希望这可以帮助!

于 2011-02-23T16:21:17.873 回答
1

当然,

class MyObject
{
    public string SomeProperty { get; set; }
    public MyObject(IDataReader reader)
    {
        SomeProperty = reader.GetString(0);
        // - or -
        SomeProperty = reader.GetString(reader.GetOrdinal("SomeProperty"));
        // etc.
    }
}
于 2011-02-23T16:08:06.173 回答