9

我试图找出 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?
        }
    }

我怎样才能做到这一点。谢谢

~~~~~~ 这是我在 Omu 的帮助下编写的完整代码

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

1 回答 1

6

和你做的一样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):
于 2011-03-29T12:30:49.197 回答