2012-05-15 4 views
4

Я использую ValueInjecter для отображения двух одинаковых объектов. Проблема, с которой я сталкиваюсь, заключается в том, что ValueInjector копирует нулевые значения из моего источника поверх моей цели. Поэтому я теряю много данных до нулевых значений.Как остановить ValueInjecter от отображения нулевых значений?

Вот пример моего объекта, который иногда заполняется только наполовину, что приводит к его нулевым значениям, переписывающим целевой объект.

public class MyObject() 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<OtherObject> OtherObjects { get; set; } 
} 

to.InjectFrom(from); 

ответ

1

В этом случае вам необходимо создать пользовательскую конвенцию. См пример # 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. 
} 
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); 
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); 
Смежные вопросы