ValueInjecter和DataTable

我试图弄清楚ValueInjecter,所以我可以在我们自己种植的小ORM中使用它。 由于我应该支持DataRow和DataTable映射,我正在尝试为这种类型实现映射器。 老实说,文档不够好,我想试一试。 也许Omu或这个图书馆的其他一些用户会回答。

这是我的DataRow注入器

public class DataRowInjection: KnownSourceValueInjection { 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 target) where T : class { // Do My Staff foreach (var row in source.Rows) { target[i].InjectFrom(row); } //return IList? } } 

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

~~~~~~这里是我用Omu的帮助写的完整代码

  public class DataTableInjection : ValueInjection where T : new() { protected override void Inject(object source, object target) { var dt = source as DataTable; var t = target as IList; foreach (DataRow dr in dt.Rows) { var t2 = new T(); t2.InjectFrom(dr); t.Add(t2); } } } 

与您为DataRow所做的相同,您现在只需使用KnownSourceValueInjection

另外正如您所看到的, Inject方法是void因此您不会返回任何只需更改目标对象(已存在)的对象。

请记住, InjectFrom不会创建新对象,而是将值注入现有对象。

所以你将有:

 var list = new List(); list.InjectFrom(dataTable) 

实际上在你的情况下,你将只使用从DataTable到IList注入,所以你可以这样做:

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

用法:

 list.InjectFrom>(datatable): 
Interesting Posts