如何编写一个泛型函数,它接受一个数据流并填充一个对象的属性
本文关键字:一个 数据流 填充 属性 一个对象 泛型 何编写 函数 | 更新日期: 2023-09-27 18:02:32
我有一些函数,比如
private static UserInfo FillUserInfoFromDataRow(DataRow dr)
{
UserInfo user = new UserInfo();
user.UserID = (int) dr["UserID"];
user.UserName = (int) dr["UserName"];
user.ProjectID = (int) dr["ProjectID"];
user.ClassID = (int) dr["ClassID"];
..............
return user;
}
我想写一些泛型函数,比如私有静态T FillEntityInfoFromDataRow(DataRow dr),它将处理类似类型ProjectInfo, JobInfo等
我可以获得DataRow参数的所有列名,但我不知道如何获得泛型T类型的所有适当字段以及如何进行适当的强制转换。这是做这份工作的一种方式吗?谢谢!
宜兰。
最好利用反射,在谷歌上没有可用的例子来做到这一点。
检查下面的例子
namespace MyNamespace.Data
{
class Converter
{
public static void Fill(object LogicObject, DataRow Row)
{
Dictionary<string, PropertyInfo> props = new Dictionary<string,PropertyInfo>();
foreach (PropertyInfo p in LogicObject.GetType().GetProperties())
props.Add(p.Name, p);
foreach (DataColumn col in Row.Table.Columns)
{
string name = col.ColumnName;
if (Row[name] != DBNull.Value && props.ContainsKey(name))
{
object item = Row[name];
PropertyInfo p = props[name];
if (p.PropertyType != col.DataType)
item = Convert.ChangeType(item, p.PropertyType);
p.SetValue(LogicObject, item, null);
}
}
}
}
}
查看完整的博文:http://kasey-jo.blogspot.com/2009/04/using-reflection-to-fill-business-layer.html
我用这个,这有点像你需要的:
编辑感谢Heinzi
public virtual void LoadDataRow(DataRow drow, params string[] parameters)
{
this.LoadDataRow(drow);
foreach (string property in parameters)
{
try
{
if (drow[property] != null)
{
PropertyInfo pi = this.GetType().GetProperty(property);
if (pi != null && drow.Table.Columns.Contains(property))
{
pi.SetValue(this, drow[property], null);
}
}
}
catch { throw; }
}
}
在你的情况下,你可能想要先循环遍历对象的eproperty集合,然后尝试从你的数据集加载,但是上面的代码应该可以让你开始。
编辑在MSDN上找到:
System.Reflection.PropertyInfo[] p = MyObject.GetType.GetProperties();
foreach(System.Reflection.PropertyInfo prop in p)
{
....
}
通过在基类中声明抽象方法将此功能委托给每个特定的类本身。顺便说一句,我建议将此方法命名为CreateFromDataRow()
abstract class InfoBase
{
public abstract InfoBase CreateFromDataRow(DataRow dr);
}
或
abstract class InfoBase<T>
{
public abstract T CreateFromDataRow(DataRow dr);
}