📅  最后修改于: 2023-12-03 15:36:58.285000             🧑  作者: Mango
C#中的IDataRecord
是一个接口,可以将数据行以任意顺序读取,以获取查询的结果集中的所有列的值,类似于ADO.NET中的DataReader对象。但是,使用IDataRecord
对象的好处是,您可以在遍历结果集中的各个数据行时,将每个数据行封装为一个初始强类型实例。
IDataRecord
通常与泛型方法结合使用,为程序员提供了更完整的数据抽象和更好的类型安全性。
public List<T> MapToList<T>(IDataReader dr) where T : new()
{
var list = new List<T>();
var props = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public);
var columnMap = new Dictionary<string, PropertyInfo>(StringComparer.OrdinalIgnoreCase);
for (var i = 0; i < dr.FieldCount; i++)
{
var columnName = dr.GetName(i);
if (props.Any(n => string.Equals(n.Name, columnName, StringComparison.Ordinal)))
{
var prop = props.First(n => string.Equals(n.Name, columnName, StringComparison.Ordinal));
columnMap[columnName] = prop;
}
}
while (dr.Read())
{
var obj = new T();
for (var i = 0; i < dr.FieldCount; i++)
{
var columnName = dr.GetName(i);
if (!columnMap.ContainsKey(columnName)) continue;
var prop = columnMap[columnName];
if (prop.CanWrite)
{
var value = dr.GetValue(i);
if (value != DBNull.Value)
{
prop.SetValue(obj, value, null);
}
}
}
list.Add(obj);
}
return list;
}
以上示例代码演示了如何使用IDataRecord
和泛型方法,将IDataReader
中的数据转换成强类型实例列表。
首先,通过反射获取实例的公共属性; 然后,通过IDataRecord
接口读取数据行中的列名,并将其映射到公共属性对象中; 最后,创建强类型实例并将其添加到列表中。
这样,您就可以使用这种方法处理各种数据源,并且可以保持类型安全性。