C# 将具有属性的列表映射到对象C

C# 将具有属性的列表映射到对象C,c#,map,automapper,C#,Map,Automapper,我想知道如何将包含属性的“keyvaluepair”列表映射到对象。 如果能和AutoMapper一起解决这个问题会很好,但是任何建议都会很好 下面是我希望它如何处理获得属性的FooBar,以及根据与FooBar属性匹配的属性应映射的键/值列表: // AutoMapper var mappedFooBar = Mapper.Map<IEnumerable<KeyValuePair<string, object>> FooBar>(fooBar); 我已经为

我想知道如何将包含属性的“keyvaluepair”列表映射到对象。 如果能和AutoMapper一起解决这个问题会很好,但是任何建议都会很好

下面是我希望它如何处理获得属性的FooBar,以及根据与FooBar属性匹配的属性应映射的键/值列表:

// AutoMapper
var mappedFooBar = Mapper.Map<IEnumerable<KeyValuePair<string, object>> FooBar>(fooBar);
我已经为此挣扎了一段时间,所以任何建议都是很好的。 也尝试用反射贴图,但似乎无法使其工作


提前感谢。

这里是一个简单、直接的反射解决方案。它不进行类型检查等,但可以轻松内置:

public void Map(IEnumerable<KeyValuePair<string,object>> data, object target) 
{
    Type t = target.GetType();
    var publicProperties = t.GetProperties();
    var setters = from kp in data
                  let prop = publicProperties.SingleOrDefault(p => p.Name == kp.Key)
                  where prop != null && prop.CanWrite
                  select new { prop, kp.Value };
    foreach(var setter in setters) 
    {
        setter.prop.SetValue(target, setter.Value, null);
    }                 
}
当然,您可以创建一个使用此功能的AutoMapper ITypeConverter。如果您已经使用AutoMapper,这可能是一个保持代码一致性的好主意


请注意,这种反射技术可能很慢-如果您需要经常映射,那么缓存每种类型的已解析setter将有助于提高性能。

我认为AutoMapper在这方面没有太多帮助。您可以为它编写一个自定义的ITypeConverter,但这仍然意味着您需要自己提供大部分实现。谢谢您的建议!谢谢你,这正是我需要的!