c# - 值注入(inject)器和数据表

标签 c# automapper valueinjecter

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

这是我的 DataRow 注入(inject)器

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

最佳答案

与您对 DataRow 所做的相同,你只需使用 KnownSourceValueInjection<DataTable>现在。

您还可以看到 Inject方法是 void所以你不会返回任何你只是改变目标对象(已经存在)。

记住 InjectFrom不会创建新对象,它会将值注入(inject)现有对象。

所以你将拥有:

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

实际上,在您的情况下,您将仅使用从 DataTable 到 IList<T> 的注入(inject) 所以你可以这样做:

   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):

关于c# - 值注入(inject)器和数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5462671/

相关文章:

c# - AutoMapper数据填充

c# - 在 System::Collections::Generic::List<T> 类型的列表中列出是可能的吗?

c# - 从扩展方法中消除可推断的泛型类型参数

c# - AutoMapper 给出无效操作异常

asp.net-mvc - 使用 Automapper 将字符串映射到枚举

asp.net - 如何使用 ValueInjector 映射列表

c# - DataGridView 设置列单元格 Combobox

c# - 在 Entity Framework 中将属性标记为 "Value generated on add or update"有什么意义?

c# - 在没有外部 dll 的情况下制作图像底片的有效方法

c# - 如何使用 AutoMapper 将 POCO 映射到 Record