使用KeyValuePair <k,v =“”> </k,>与AutoMapper无映射

时间:2014-09-09 11:15:39

标签: .net generics automapper automapper-3

我正在构建一个通用的漂亮打印方法。我想单独处理的一种特殊类型是KeyValuePair<TK,TV>。为了将对象缩小为已知类型,我想我会将每个KeyValuePair<TK,TV>映射到KeyValuePair<object, object>

以下代码始终在Key的{​​{1}},Value属性中生成2个空值。

proxy

另一方面,这个非通用版本按预期工作:

Mapper.CreateMap(o.GetType(), typeof(KeyValuePair<object, object>));
var proxy = Mapper.Map<KeyValuePair<object, object>>(o);

为什么吗

Mapper.CreateMap(o.GetType(), typeof(DictionaryEntry)); var proxy = Mapper.Map<DictionaryEntry>(o); 在此阶段已经过测试为o 我在.NET 4.0上使用AutoMapper 3.2.1.0。

1 个答案:

答案 0 :(得分:6)

DictionaryEntry&#39; KeyValue都可以设置。当您映射到DictionaryEntry时,AutoMapper会匹配KeyValue属性并设置它们。

它无法使用KeyValuePair<TKey, TValue>执行此操作,因为它是不可变的。因此,AutoMapper会返回一个新的KeyValuePair<object, object>,其中KeyValue属性未设置。

通常,您可以使用ConstructUsing来解决此问题:

Mapper.CreateMap<KeyValuePair<string, string>, KeyValuePair<object, object>>()
    .ConstructUsing(kvp => new KeyValuePair<object, object>(kvp.Key, kvp.Value));

但是,由于您未使用此CreateMap版本,因此无法做到这一点。

您可以创建一个简单的扩展方法来执行此操作:

public static class KeyValuePairExtensions
{
    public static KeyValuePair<object, object> CastUp<TKey, TValue>(
        this KeyValuePair<TKey, TValue> kvp)
    {
        return new KeyValuePair<object, object>(kvp.Key, kvp.Value);
    }
}

然后使用它而不是AutoMapper:

var kvp = new KeyValuePair<string, string>("Hello", "World");
KeyValuePair<object, object> proxy = kvp.CastUp();

这可以防止您必须为您使用的每个KeyValuePair变体创建不同的映射定义。