ValueInjecter и DataTable - PullRequest
       26

ValueInjecter и DataTable

8 голосов
/ 28 марта 2011

Я пытался выяснить ValueInjecter, чтобы я мог использовать его в нашей собственной маленькой ORM.Поскольку я должен поддерживать сопоставление DataRow и DataTable, я пытаюсь реализовать сопоставители для этих типов.И, честно говоря, документация не достаточно хороша, и я хотел дать ей шанс.Может быть, Omu или некоторые другие пользователи этой библиотеки ответят.

вот мой инжектор DataRow

public class DataRowInjection: KnownSourceValueInjection<DataRow>
    {
        protected override void Inject(DataRow source, object target)
        {
            for (var i = 0; i < source.ItemArray.Count(); i++)
            {

                //TODO: Read from attributes or target type
                var activeTarget = target.GetProps().GetByName(source.Table.Columns[i].ToString(), true);
                if (activeTarget == null) continue;

                var value = source.ItemArray[i];
                if (value == DBNull.Value) continue;

                activeTarget.SetValue(target, value);
            }
        }
    }

, это работает довольно хорошотак вот вопрос, как я могу реализовать это для DataTable и вернуть Ienumarable или IList.фрагмент кода, который я ожидаю сделать, похож на

public class DataTableInjector  : ?????
    {
        protected override void Inject(DataTable source, IList<T> target)   where T : class
        {

          // Do My Staff
            foreach (var row in source.Rows)
            {
                target[i].InjectFrom<DataRowInjection>(row);
            }

            //return IList?
        }
    }

Как мне это сделать.Спасибо

~~~~~~ вот полный код, который я написал с помощью Ому

 public class DataTableInjection<T> : ValueInjection where T  : new()
    {
        protected override void Inject(object source, object target)
        {
            var dt = source as DataTable;
            var t = target as IList<T>;

            foreach (DataRow dr in dt.Rows)
            {
                var t2 = new T();
                t2.InjectFrom<DataRowInjection>(dr);
                t.Add(t2);
            }
        }
    }

1 Ответ

5 голосов
/ 29 марта 2011

То же, что вы сделали для DataRow, вы просто используете KnownSourceValueInjection<DataTable> сейчас.

Также, как вы можете видеть, метод Inject равен void, поэтому вы ничего не возвращаете, простоизмените целевой объект (который уже существует).

Помните, что InjectFrom не создает новые объекты, он вводит значения в существующий.

Итак, вы получите:

var list = new List<T>();
list.InjectFrom<MyFromDataTableInj>(dataTable)

На самом деле в вашем случае вы собираетесь использовать эту инъекцию только из DataTable в IList<T>, чтобы вы могли сделать так:

   public class My<T> : ValueInjection
   {
        protected override void Inject(object source, object target)
        {
            var dt = source as DataTable;
            var t = target as IList<T>;
... 
        }
    }

И использование:

list.InjectFrom<My<Foo>>(datatable):
...