首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueInjecter和DataTable

ValueInjecter和DataTable
EN

Stack Overflow用户
提问于 2011-03-29 01:24:37
回答 1查看 3K关注 0票数 9

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

这是我的DataRow注入器

代码语言:javascript
复制
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。我希望做的代码片段是这样的。

代码语言:javascript
复制
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?
        }
    }

我如何才能做到这一点。谢谢

代码语言:javascript
复制
代码语言:javascript
复制
 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);
            }
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-29 20:30:49

与对DataRow所做的一样,现在只需使用KnownSourceValueInjection<DataTable>即可。

同样,如您所见,Inject方法为void,因此您不会返回任何内容,只需更改目标对象(它已经存在)即可。

请记住,InjectFrom不会创建新对象,它会将值注入到现有对象中。

因此,您将拥有:

代码语言:javascript
复制
var list = new List<T>();
list.InjectFrom<MyFromDataTableInj>(dataTable)

实际上,在您的例子中,您将仅从DataTable到IList<T>使用此注入,因此您可以这样做:

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

和用法:

代码语言:javascript
复制
list.InjectFrom<My<Foo>>(datatable):
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5462671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档