关于 c#:ValueInjecter 和 DataTable

ValueInjecter and DataTable

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

这是我的 DataRow 注入器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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。我期望做的代码片段就像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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的帮助下编写的完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 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 不会创建新对象,它会将值注入到现有对象中。

所以你将拥有:

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

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

1
2
3
4
5
6
7
8
9
   public class My< T > : ValueInjection
   {
        protected override void Inject(object source, object target)
        {
            var dt = source as DataTable;
            var t = target as IList< T >;
...
        }
    }

及用法:

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