我正在尝试构建一个扩展来使用SQLDataReader中的值填充对象。
到目前为止我的代码是
public static T RetunObject<T>(this Type source, SqlDataReader dr)
{
Type type = source.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
property.SetValue(property, dr[property.Name]);
type.GetProperty(property.Name).SetValue(type, dr[property.Name]);
}
return type.Cast<T>();
}
有一点可以肯定的是,最后一行不正确,并且不确定此时是否有办法实现此目的。
目标结果是使用像
这样的代码MyClass myclass = new MyClass();
var results = myclass.ReturnObject(myDataReader);
反思从来都不是我的强项。所以我很确定我相当遥远。
出现的更新代码
public static object RetunObject(this object source, SqlDataReader dr)
{
while (dr.Read())
{
foreach (PropertyInfo property in source.GetType().GetRuntimeProperties())
{
if(dr.GetSchemaTable().Select("ColumnName='"+ property.Name+"'").Count() == 1)
{
var readervalue = dr.GetValue(dr.GetOrdinal(property.Name));
property.SetValue(source, readervalue);
}
}
}
return source;
}
像
一样使用 return (Role)role.RetunObject(sqlcomm.ExecuteReader());
使用SQLDataReader并返回一个通用对象,该对象可以转换为您需要的对象类型。显然,如果你试图转换为无效类型的对象,那么它不会起作用,但到目前为止这似乎有效。我的下一个试验将是测试嵌套类,看它是否也能在那里工作。
答案 0 :(得分:1)
在你的例子中有很多错误,你完全不清楚你想要完成什么。可能你试图将阅读器的属性应用到你的对象:
public static T RetunObject<T>(this T source, SqlDataReader dr)
{
var type = typeof(T);
var properties = type.GetProperties();
foreach (var property in properties)
{
property.SetValue(source, dr[property.Name]);
}
return source;
}
但是,我建议您使用Entity Framework,因为您可能通过这样做来创建另一个自行车。与您尝试完成的解决方案相比,此任务完成得更好/更快/更安全。
在尝试实施某些内容之前,尽量花一些时间在人们常用的东西上,这是你身边没有人会理解/支持的。
与花时间在潜在的错误代码上相比,它会更有用,更快捷。以下是EF Code First的良好开端:https://msdn.microsoft.com/en-us/library/jj193542(v=vs.113).aspx