3

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

以下代码始终在 的KeyValue属性中产生 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在这个阶段已经被测试为一个KeyValuePair<,>
我在 .NET 4.0 上使用 AutoMapper 3.2.1.0。

4

1 回答 1

8

DictionaryEntryKeyValue都是可设置的。当您映射到 时DictionaryEntry,AutoMapper 匹配KeyandValue属性并设置它们。

它无法做到这一点,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这将防止您必须为您使用的每个变体创建不同的映射定义。

于 2014-09-09T14:36:10.717 回答