我试图弄清楚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?
}
}我如何才能做到这一点。谢谢
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);
}
}
}发布于 2011-03-29 20:30:49
与对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):https://stackoverflow.com/questions/5462671
复制相似问题