我尝试创建一个通用方法,根据属性名称将结果从SqlDataReader
转换为POCO object
。这是我到目前为止所得到的:
POCO对象:
public class Order
{
[DbField]
public int OrderId { get; set; }
[DbField]
public string OrderName { get; set; }
[DbField]
public DateTime OrderDate { get; set; }
public int NonDbProperty { get; set; }
}
属性定义:
public class DbFieldAttribute : Attribute { }
使用对象的DbField属性检索所有属性的方法:
public static IEnumerable<string> GetPropertiesWithDbAttribute<T>()
{
var allProps = typeof(T).GetProperties();
var props = allProps.Where(p => Attribute.IsDefined(p, typeof(DbFieldAttribute))).Select(n => n.Name);
return props.ToList();
}
和实际的SELECT
操作:
public object GetFirstOrder()
{
try
{
Order temp = new Order();
using (SqlConnection con = new SqlConnection(GetConnection()))
using (var cmd = con.CreateCommand())
{
con.Open();
cmd.CommandText = "SELECT * FROM [Order] WHERE OrderId = 1";
using (SqlDataReader sdr = cmd.ExecuteReader())
{
if (sdr.HasRows)
{
var props = Utils.GetPropertiesWithDbAttribute<Order>();
while (sdr.Read())
{
foreach (string item in props)
{
temp.GetType().GetProperty(item).SetValue(temp, sdr[item]);
}
}
}
}
}
return temp;
}
catch (Exception ex)
{
return null;
}
}
这在我到目前为止所做的测试中有效,但是我想知道在object
中检索到的sdr[item]
之间的自动转换是否足够,或者我是否应该使用基于的显式转换属性的类型,例如:
//DateTime? property:
temp.GetType().GetProperty(item).SetValue(temp, sdr[item] == DBNull.Value? null: (DateTime?)sdr[item]);