Automapper définit une propriété array sur un tableau de longueur nulle plutôt que null

J'utilise Automapper pour copier des valeurs d'une instance à une autre, et je constate que si la classe a une propriété array et que l'instance source a la propriété null, Automapper définit la propriété destination sur un tableau de longueur nulle au lieu de null comme je m'y attendais.

Est-il un moyen de configurer Automapper pour définir la destination de null quand la source est null?

Dans le cas où mon explication n'est pas claire, le code suivant illustre ce que j'essaie de faire décrire:

public class Test
{
    public byte[] ByteArray { get; set; }
    public int? NullableInt { get; set; }
    public int Int { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Mapper.CreateMap<Test, Test>();

        var test1 = new Test { Int = 123, NullableInt = null, ByteArray = null };
        var test2 = Mapper.Map<Test>(test1);

        // test1:  Int == 123, NullableInt == null, ByteArray == null
        // test2:  Int == 123, NullableInt == null, ByteArray == byte[0]  <-- expect this to be null
    }
}
21
demandé sur Jeff Ogata 2011-12-07 03:53:36

2 réponses

J'ai trouvé que cela était déjà signalé comme un problème , et une nouvelle option de configuration a été ajoutée (voir ce commit ). En ce moment, l'option n'est pas dans la version disponible via NuGet, mais j'ai pu trouver un moyen de gérer cela jusqu'à ce que la prochaine version soit publiée:

Mapper.CreateMap<Test, Test>()
    .ForMember(t => t.ByteArray, opt => opt.ResolveUsing(t => t.ByteArray == null ? null : t.ByteArray));

Mise à jour:

Depuis la version 2.1.265.0, vous pouvez utiliser la propriété AllowNullCollections:

Mapper.Configuration.AllowNullCollections = true;
Mapper.CreateMap<Test, Test>();
38
répondu Jeff Ogata 2012-03-19 23:52:55

Je pense que c'est juste une bizarrerie d'utiliser exactement le même type pour la source et la destination. Si vous en faites des types différents, le tableau d'octets apparaît comme null.

0
répondu PatrickSteele 2011-12-07 01:36:00