gpt4 book ai didi

c# - 如何将 Automapper 配置为自动忽略具有 ReadOnly 属性的属性?

转载 作者:IT王子 更新时间:2023-10-29 04:38:00 26 4
gpt4 key购买 nike

上下文:

假设我有以下“目标”类:

public class Destination
{
public String WritableProperty { get; set; }

public String ReadOnlyProperty { get; set; }
}

和一个“源”类,其中一个属性具有 ReadOnly 属性:

public class Source
{
public String WritableProperty { get; set; }

[ReadOnly(true)]
public String ReadOnlyProperty { get; set; }
}

很明显,但要清楚:我将按以下方式从 Source 类映射到 Destination 类:

Mapper.Map(source, destination);

问题:

配置 Automapper 以自动忽略具有 ReadOnly(true) 属性的属性的方法有哪些?

约束条件:

我使用 Automapper 的 Profile 类进行配置。我不想弄脏具有 Automapper 特定属性的类。我不想为每个只读属性配置 Automapper 并通过这种方式导致大量重复。

可能(但不适合)的解决方案:

1) 将属性IgnoreMap 添加到属性中:

    [ReadOnly(true)]
[IgnoreMap]
public String ReadOnlyProperty { get; set; }

我不想弄脏具有自动映射器特定属性的类并使其依赖于它。此外,我不想添加附加属性以及 ReadOnly 属性。

2) 配置Automapper忽略属性:

CreateMap<Source, Destination>()
.ForSourceMember(src => src.ReadOnlyProperty, opt => opt.Ignore())

这不是一种方法,因为它迫使我对任何地方的每个属性都这样做,并且还会导致大量重复。

最佳答案

编写扩展方法如下图:

public static class IgnoreReadOnlyExtensions
{
public static IMappingExpression<TSource, TDestination> IgnoreReadOnly<TSource, TDestination>(
this IMappingExpression<TSource, TDestination> expression)
{
var sourceType = typeof(TSource);

foreach (var property in sourceType.GetProperties())
{
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(sourceType)[property.Name];
ReadOnlyAttribute attribute = (ReadOnlyAttribute) descriptor.Attributes[typeof(ReadOnlyAttribute)];
if(attribute.IsReadOnly == true)
expression.ForMember(property.Name, opt => opt.Ignore());
}
return expression;
}
}

调用扩展方法:

Mapper.CreateMap<ViewModel, DomainModel>().IgnoreReadOnly();

关于c# - 如何将 Automapper 配置为自动忽略具有 ReadOnly 属性的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28382811/

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