如何在 C# 中映射 属性 列表?

How to map a property in C# that is a list?

这些是我的 类:

    public class Registration
    {
        public bool? IsRegistered { get; set; }
        public List<RegistrationProcess> RegistrationProcess { get; set; }
    }

    public class RegistrationProcess
    {
        public bool? PaidInFull { get; set; }
        public double PaymentAmount { get; set; }
        public bool IdentityVerified { get; set; }
    }

我有一个方法可以像这样进行对象映射:

public Registration Translate(Services.Registration source)
        {
            return new Registration
            {
                IsRegistered = source.IsRegistered,
                RegistrationProcess = new List<RegistrationProcess>
                {
                    new RegistrationProcess()
                    {
                        PaidInFull = source.RegistrationProcess.Select(o => o.HasPaid),
                        
                    }
                }
            };
        }

我不确定如何为 RegistrationProcess 设置映射。 我想将 RegistrationProcess 中的 PaidInFull 映射到 属性 HasPaid。他们都是布尔值。 我收到一个错误:无法将类型 'System.Collections.Generic.IEnumerable<bool?>' 隐式转换为 'bool?' 我觉得我需要在 Select 语句的末尾添加一些内容,但我不确定是什么。我执行了 FirstOrDefault() 并使错误消失,但我只得到一个值,这不是我想要的。

您的方法存在的问题是您只在列表构造函数中创建了 RegistrationProcess 的一个实例。因此,通过调用 source.RegistrationProcess.Select(o => o.HasPaid) 并将其分配给新创建的 RegistrationProcess,您正在创建服务注册过程的所有 bool 值的集合,并尝试将其分配给单个注册过程。

解决方案是创建多个 RegistrationProcess 实例。事实上,source.RegistrationProcess 中的每个元素一个。为此,您可以直接在 source.RegistrationProcess 上使用 Select 方法:

source.RegistrationProcesses.Select(x => new RegistrationProcess() { PaidInFull = x.HasPaid }).ToList()

如您所见,source.RegistrationProcesses 中的每个元素都会创建一个新的 RegistrationProcess。或者换句话说:你 select source.RegistrationProcesses 的元素作为 new RegistrationProcess() { PaidInFull = x.HasPaid } 如果这对你更有意义。 .ToList() 将 IEnumerable 转换为列表。