我有一个满是字符串的表,我需要将其转换为具有类型的通用对象列表。到目前为止我所拥有的。
private List<T> ConvertDataToObject<T>(object oClass, string sSQL)
{
List<T> lReturn = new List<T>();
SqlConnection sqlCon = new SqlConnection(sqlConnString);
SqlCommand sqlCom = new SqlCommand(sSQL.ToString());
sqlCom.Connection = sqlCon;
try
{
sqlCon.Open();
SqlDataReader sqlDR = sqlCom.ExecuteReader();
while (sqlDR.Read())
{
foreach (var prop in oClass.GetType().GetProperties())
{
if (prop.Name == sqlDR[prop.Name])
{
prop.SetValue(oClass, Convert.ChangeType(sqlDR[prop.Name].ToString().Trim().Replace("'", "''"), prop.PropertyType), null);
}
}
}
}
catch
{ }
finally
{ sqlCon.Close(); }
return lReturn;
}
我认为这是不对的:1:我需要在列表中填写对象,但我不确定我想怎么做2:我不确定2个循环是否是填充对象的最佳方式。
我以前写过一个类来将DB查询结果映射到对象。这个实现中唯一的"问题"是SQL列名需要与类的属性名匹配。
这是类别:
public class DataObjectMapper<T> where T : new()
{
public List<T> MapResultsToObject(IDataReader reader)
{
List<T> objects = new List<T>();
while (reader.Read())
{
objects.Add(MapRow(reader));
}
return objects;
}
private T MapRow(IDataReader reader)
{
T item = new T();
var typeProperties = typeof(T).GetProperties();
foreach (var property in typeProperties)
{
int ordinal = reader.GetOrdinal(property.Name);
if (!reader.IsDBNull(ordinal))
{
property.SetValue(item, reader[ordinal].ToString(), null);
}
}
return item;
}
}
以下是的使用方法
DataObjectMapper<T> resultsMapper = new DataObjectMapper<T>();
SqlDataReader reader = command.ExecuteReader();
List<T> results = resultsMapper.MapResultsToObject(reader);