如何编写一个泛型函数,它接受一个数据流并填充一个对象的属性

本文关键字:一个 数据流 填充 属性 一个对象 泛型 何编写 函数 | 更新日期: 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);
}