如何编写一个采用数据行并填充对象属性的泛型函数?

时间:2011-07-14 08:34:55

标签: c# .net data-binding reflection

我有一些像

这样的功能
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;
}

我想写一些通用函数 private static T FillEntityInfoFromDataRow(DataRow dr),它将处理类似的类型ProjectInfo,JobInfo等。

我可以获取DataRow参数的所有列名称,但我不知道如何获取通用T类型的所有相应字段以及如何进行适当的转换。 这是完成这项工作的方法吗? 谢谢!

伊兰。

3 个答案:

答案 0 :(得分:10)

最好利用反射,谷歌没有这样的例子可以做到这一点。

检查以下示例

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

答案 1 :(得分:1)

我使用它,这有点像你需要的:

感谢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)
{
  ....
}

答案 2 :(得分:0)

通过在基类中声明抽象方法,将此功能委派给每个特定的类本身。 顺便说一句,我建议将此方法命名为CreateFromDataRow()

abstract class InfoBase
{
    public abstract InfoBase CreateFromDataRow(DataRow dr);
}

OR

abstract class InfoBase<T>
{
    public abstract T CreateFromDataRow(DataRow dr);
}