我正在构建一个通用的漂亮打印方法。我想单独处理的一种特殊类型是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。
答案 0 :(得分:6)
DictionaryEntry
&#39; Key
和Value
都可以设置。当您映射到DictionaryEntry
时,AutoMapper会匹配Key
和Value
属性并设置它们。
它无法使用KeyValuePair<TKey, TValue>
执行此操作,因为它是不可变的。因此,AutoMapper会返回一个新的KeyValuePair<object, object>
,其中Key
和Value
属性未设置。
通常,您可以使用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
变体创建不同的映射定义。