我正在使用ValueInjecter来映射两个相同的对象。我遇到的问题是ValueInjector从我的源上复制我的目标的空值。所以我将大量数据丢失为空值。
这是我的对象的一个例子,有时只填写了一半,导致其空值覆盖目标对象。
public class MyObject()
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<OtherObject> OtherObjects { get; set; }
}
to.InjectFrom(from);
答案 0 :(得分:3)
对于使用ValueInjecter
v3 +的用户,已弃用ConventionInjection
。使用以下来获得相同的结果:
public class NoNullsInjection : LoopInjection
{
protected override void SetValue(object source, object target, PropertyInfo sp, PropertyInfo tp)
{
if (sp.GetValue(source) == null) return;
base.SetValue(source, target, sp, tp);
}
}
用法:
target.InjectFrom<NoNullsInjection>(source);
答案 1 :(得分:1)
在这种情况下,您需要创建自定义的ConventionInjection。参见示例#2: http://valueinjecter.codeplex.com/wikipage?title=step%20by%20step%20explanation&referringTitle=Home
因此,您需要覆盖Match方法:
protected override bool Match(ConventionInfo c){
//Use ConventionInfo parameter to access the source property value
//For instance, return true if the property value is not null.
}
答案 2 :(得分:1)
你想要这样的东西。
public class NoNullsInjection : ConventionInjection
{
protected override bool Match(ConventionInfo c)
{
return c.SourceProp.Name == c.TargetProp.Name
&& c.SourceProp.Value != null;
}
}
用法:
target.InjectFrom(new NoNullsInjection(), source);