gpt4 book ai didi

c# - Automapper 中参数的条件映射

转载 作者:行者123 更新时间:2023-12-05 07:18:06 34 4
gpt4 key购买 nike

我想将一个参数传递给一个映射,然后它根据该参数决定一个值。

一个简单的类

public class Person
{
string Name;
}

及其DTO

public class PersonDTO
{
string Name;
string IsAProgrammer;
}

我想要这样的东西

var parameterIsTrue = true; // how do I pass this value?

CreateMap<MyClassDTO, MyClass>()
.ForMember(x => x.Name, opt => opt.MapFrom(src => src.Name))
.ForMember(x => x.IsAProgrammer,
opt => opt.MapFrom(parameterIsTrue ? "sure!" : "nope"));

编辑

我正在尝试编写一个自定义解析器,但不知道如何向它传递参数。我想出了如何制作解析器:

public class PersonResolver : IValueResolver<Person, PersonDTO, string>
{
...
public string Resolve(Person src,
PersonDTO dest,
string destMember,
ResolutionContext context)
{
return (bool) context.Items["isProgrammer"] ? "sure!" : "nope";
}
}

但我仍然无法映射:

CreateMap<MyClassDTO, MyClass>()
.ForMember(x => x.Name, opt => opt.MapFrom(src => src.Name))
.ForMember(x => x.IsAProgrammer,
opt => opt.ResolveUsing(PersonResolver)); // what ???
// how do I pass the context?

最佳答案

我找到了适用于我的用例的解决方案。我有关于在某些情况下不想加载的对象的详细信息。

我创建了这个扩展方法,以便于对满足此条件的所有属性进行重用:


/// <summary>
/// Don't map the field if the provided <paramref name="keyName"/> is set to <see cref="false"/>. Defaults to true otherwise
/// </summary>
public static IMemberConfigurationExpression<TSource, TDestination, TMember>
IgnoreIfParam<TSource, TDestination, TMember>(
this IMemberConfigurationExpression<TSource, TDestination, TMember> config,
string keyName)
{
config
.PreCondition(rc =>
{
if (rc.Options.Items.TryGetValue(keyName, out var performMapping) && performMapping is bool b)
{
return b;
}
return true;
});
return config;
}

在你的映射配置文件中,你可以像这样使用上面的扩展方法:

public const string IncludeDetail = "IncludeDetail";

public MyProfile() {
CrateMap<Source, Dest>()
//for a member with a specified MapFrom():
.ForMember(x => x.Media, c => c.IgnoreIfParam(IncludeProductDetail).MapFrom(x => x.Detail.Media))

//for a member with implied MapFrom() on the source, you don't need MapFrom()
.ForMember(x => x.Name, c => c.IgnoreIfParam(MyProfile.IncludeDetail))

然后为了在映射时设置这个条件,我创建了另一个辅助扩展方法:

public static IMappingOperationOptions<object, TDestination> 
SetOption<TDestination>(
this IMappingOperationOptions<object, TDestination> options,
string key, bool val)
{
options.Items[key] = val;
return options;
}

然后你可以像这样在映射时调用它:

var res = _mapper.Map<MyView>(model, o => o
.SetOption(MyProfile.IncludeDetail, false)
);
return res;

关于c# - Automapper 中参数的条件映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58492919/

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