【发布时间】:2015-04-22 17:57:24
【问题描述】:
我正在从 SqlCommand 创建一个数据读取器,我目前将此信息存储在一个具有以下内容的类中
private object PopulateObjectWithFields(SqlDataReader read, Type className)
{
var gd = Activator.CreateInstance(className);
for (int i = 0; i < read.FieldCount; i++)
{
var type = gd.GetType();
var fi = type.GetField(read.GetName(i));
if (fi != null)
{
if (!Convert.IsDBNull(read[i]))
{
try
{
fi.SetValue(gd, read[i]);
}
catch
{
throw new Exception(string.Format("Unable to set {0}. Class type {1}. DB Type {2}", read.GetName(i), fi.FieldType.Name, read[i].GetType().Name));
}
}
}
else
{
var pi = type.GetProperty(read.GetName(i));
if (pi != null)
{
if (!Convert.IsDBNull(read[i]))
{
try
{
pi.SetValue(gd, read[i]);
}
catch
{
throw new Exception(string.Format("Unable to set {0}. Class type {1}. DB Type {2}", read.GetName(i), fi.FieldType.Name, read[i].GetType().Name));
}
}
}
}
}
return gd;
}
这非常有效。我现在想把它放在List<class> 中,但我似乎无法正确地动态创建List<class>。
有人可以帮我解决语法吗?
var MyList = List<MyClass> //This should be dynamically created
using(var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
MyList.Add(PopulateObjectWithFields(read, MyClass));
}
}
让我澄清一下 我不知道阅读器中将包含哪些列,也不知道要传入什么类。我有一个通用方法,只要列名就需要将任何阅读器填充到任何类匹配类中字段的属性
【问题讨论】:
-
你能把它变成一个通用方法,而不是把
Type作为参数传入吗? -
我也有这样的,我用
var gdtype = Assembly.GetExecutingAssembly().GetTypes().First(t => t.Name == className);从字符串中获取类型,所以没关系 -
伙计们,我需要一种创建 LIST 的通用方法。不映射或转换任何东西。我想要一种动态的方式来创建
List<T> -
另请注意,您的解决方案可以提高性能 - 您使用反射来获取每一行的属性列表;您可以预先准备反射属性列表并重用映射。
标签: c# reflection