在映射具有自定义属性的所有源成员时,如何调用扩展方法?

时间:2018-10-23 20:38:08

标签: c# automapper automapper-6

我正在使用AutoMapper v6.1.1将丰富域模型实体映射到一些扁平化的DTO。

我正在用静态类初始化配置,该类返回一个IMapper,该类将添加我们的映射配置文件并为所有地图配置PreserveReferences()

我已针对我的源实体成员的子集(仅适用于string类型的成员)声明了一个自定义属性。

我想向AutoMapper添加一个全局配置,该配置允许我在映射期间针对具有该属性的任何成员调用扩展方法。

这些成员中的每一个都会以许多不同的目的地类型结束,因此我认为这是确保始终为那些成员运行扩展方法而无需为每个新地图明确配置扩展方法的简单方法。

下面是一个人为的例子。

来源实体:

public class SomeEntity
{
    public string PropertyWithoutCustomAttribute { get; set; }

    [CustomAttribute]
    public string PropertyWithCustomAttribute { get; set; }
}

目标实体:

public class SomeEntityDto
{
    public string PropertyWithoutCustomAttribute { get; set; }

    public string PropertyWithCustomAttribute { get; set; }
}

扩展方式:

public static string AppendExclamationMark(this string source)
{
    return source + "!";
}

如果我的源实例是用以下值定义的:

var source = new SomeEntity
{
    PropertyWithoutCustomAttribute = "Hello",
    PropertyWithCustomAttribute = "Goodbye"
};

我希望以下陈述是正确的:

destination.PropertyWithoutCustomAttribute == "Hello"
destination.PropertyWithCustomAttribute == "Goodbye!"

我已经完全陷入困境(并且在文档方面有些挣扎),但是我认为最接近的是:

cfg.ForAllPropertyMaps(
    map => map.SourceType == typeof(string) &&
           map.SourceMember
               .GetCustomAttributes(
                   typeof(CustomAttribute),
                   true)
               .Any(),
    (map, configuration) => map.???);

即使能告诉我这是一个糟糕的主意还是不可能,任何帮助都将不胜感激。

0 个答案:

没有答案