Как остановить ValueInjecter от сопоставления нулевых значений?

Я использую 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);

person LivingOnACloud    schedule 15.05.2012    source источник


Ответы (3)


В этом случае вам нужно создать собственный 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.
}
person Mikhail    schedule 15.05.2012

Для тех, кто использует 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);
person Korayem    schedule 04.05.2016

Вы хотите что-то вроде этого.

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);
person James McCormack    schedule 16.05.2014