5

DTO にはプロパティが必要ですが、POCO にはDateTimenull 許容の日時が使用されています。ForMemberこの条件ですべてのプロパティのマッピングを作成する必要がないように、 ITypeConverter<DateTime?, DateTime>. 私が遭遇した問題は、DTO と POCO の両方に、このコンバーターが呼び出される null 可能な DateTime がある場合です。プロパティがnull可能な日時であってもDestinationTypeです。DateTimeこのコンバーターを実際のnull許容日時に対してのみ実行する方法はありますか?

public class FooDTO
{
    public DateTime? FooDate { get; set; }
}

public class FooPoco
{
    public DateTime? FooDate { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Mapper.CreateMap<FooDTO, FooPoco>();
        Mapper.CreateMap<DateTime?, DateTime>()
              .ConvertUsing<NullableDateTimeConverter>();
        var poco = new FooPoco();
        Mapper.Map(new FooDTO() { FooDate = null }, poco);

        if (poco.FooDate.HasValue)
            Console.WriteLine(
                "This should be null : {0}",
                poco.FooDate.Value.ToString()); //Value is always set 
        else
            Console.WriteLine("Mapping worked");
    }
}

public class NullableDateTimeConverter : ITypeConverter<DateTime?, DateTime>
{
    // Since both are nullable date times and this handles converting
    // nullable to datetime I would not expect this to be called. 
    public DateTime Convert(ResolutionContext context)
    {
        var sourceDate = context.SourceValue as DateTime?;
        if (sourceDate.HasValue)
            return sourceDate.Value;
        else
            return default(DateTime);
    }
}

この投稿AutoMapper TypeConverter mapping nullable type to not-nullable typeを見つけましたが、ほとんど役に立ちませんでした。

4

1 に答える 1