Как написать универсальную функцию, которая принимает datarow и заполняет свойства объекта? - PullRequest
4 голосов
/ 14 июля 2011

У меня есть такая функция, как

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 и как выполнить соответствующее приведение. Это какой-то способ сделать эту работу? Спасибо!

Илан.

Ответы [ 3 ]

10 голосов
/ 14 июля 2011

Лучше использовать отражение. Нет примеров, доступных на Google, чтобы сделать это.

Проверьте приведенный ниже пример

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-отражение-to-fill-business-layer.html

1 голос
/ 14 июля 2011

Я использую это, что-то вроде того, что вам нужно:

РЕДАКТИРОВАНИЕ благодаря Хайнци

    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; }
        }
    }

В вашем случае, возможно, вы захотитеСначала прокрутите коллекцию свойств вашего объекта и попытайтесь загрузить ее из набора данных, но этот код должен помочь вам начать работу.

EDIT

Обнаружено это на MSDN:

System.Reflection.PropertyInfo[] p = MyObject.GetType.GetProperties();
foreach(System.Reflection.PropertyInfo prop in p)
{
  ....
}
0 голосов
/ 14 июля 2011

Делегируйте эту функцию каждому конкретному классу, объявив метод abstarct в базовом классе.Кстати, я предлагаю назвать этот метод как CreateFromDataRow()

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

ИЛИ

abstract class InfoBase<T>
{
    public abstract T CreateFromDataRow(DataRow dr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...