将包含属性的列表映射到对象C#

时间:2011-11-22 20:14:40

标签: c# map automapper

我想知道如何使用'keyvaluepair'将包含属性的列表映射到对象。 用AutoMapper解决它会很好,但任何建议都会非常友好。

以下是我希望如何使用FooBar获取属性以及应根据与FooBars属性匹配的属性映射的键/值列表:

// AutoMapper
var mappedFooBar = Mapper.Map<IEnumerable<KeyValuePair<string, object>> FooBar>(fooBar);

我一直在努力解决这个问题,所以任何建议都会很好。 也尝试用反射进行映射,但似乎无法让它起作用。

提前致谢。

1 个答案:

答案 0 :(得分:1)

这是一个简单,直接的反射解决方案。它不进行类型检查等,但它可以很容易地构建:

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将有利于提高性能。