gpt4 book ai didi

c# - 如何为 AutoMapper 实现自定义命名解析器

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:55 25 4
gpt4 key购买 nike

如何使用 AutoMapper 映射以下类而不显式指示所有成员映射:

public class Source
{
public string FirstName { get; set; }
public string LastName { get; set; }
... (huge amount of other properties)
}

上课:

public class Destination
{
public string Imie { get; set; }
public string Nazwisko { get; set; }
... (huge amount of other properties)
}

使用翻译类:

var translations = new Dictionary<string, string>()
{
{ "FirstName", "Imie" },
{ "LastName", "Nazwisko" },
... (huge amount of other translations)
}

最佳答案

这里是你如何做到的。

考虑以下方法:

public void CreateMapBasedOnDictionary<TSource, TDestination>(IDictionary<string, string> mapping_dictionary)
{
var mapping_expression = AutoMapper.Mapper.CreateMap<TSource, TDestination>();

foreach (var kvp in mapping_dictionary)
{
string source_property_name = kvp.Key;
string destination_property_name = kvp.Value;

Type member_type = typeof (TSource).GetProperty(source_property_name).PropertyType;

mapping_expression = mapping_expression.ForMember(destination_property_name, x =>
{
typeof (IMemberConfigurationExpression<TSource>)
.GetMethod("MapFrom", new []{typeof(string)})
.MakeGenericMethod(member_type)
.Invoke(x, new[] { source_property_name });
});
}
}

然后你可以像这样使用它:

var translations = new Dictionary<string, string>()
{
{"FirstName", "Imie"},
{"LastName", "Nazwisko"},

};

CreateMapBasedOnDictionary<Source, Destination>(translations);

Source src = new Source()
{
FirstName = "My first name",
LastName = "My last name"
};

var dst = AutoMapper.Mapper.Map<Destination>(src);

下面是CreateMapBasedOnDictionary 方法的解释:

AutoMapper 已经有一个 ForMember 重载,允许您通过名称指定目标属性。我们在这里很好。

它还有一个 MapFrom 重载,允许您通过名称指定源属性。然而,此重载的问题在于它需要属性类型的通用参数 (TMember)。

我们可以解决这个问题,方法是使用反射获取属性的类型,然后使用适当的 TMember 类型参数动态调用 MapFrom 方法。

关于c# - 如何为 AutoMapper 实现自定义命名解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33190568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com