【问题标题】:How add dynamically a list form one object to another?如何动态地将列表从一个对象添加到另一个对象?
【发布时间】:2017-09-20 18:26:08
【问题描述】:

我有一个包含列表的类。我想将该列表复制到另一个包含相同类型和数量的属性的对象。

        List<CinemaUnitSchema> cinemaUnitSchemas = new List<CinemaUnitSchema>();
        foreach (CinemaUnit cinemaUnits in scenario.CinemaUnits)
        {
            cinemaUnitSchemas.Add(new CinemaUnitSchema
            {
                Name = cinemaUnits.Name,
                AttendantPoints = cinemaUnits.AttendantPoints,
                ShowPoints = cinemaUnits.ShowPoints
            });                

        }
        scenarioSchema.CinemaUnits.AddRange(CinemaUnitSchemas);

但是,我在这行代码中收到错误;

AttendantPoints = cinemaUnits.AttendantPoints

我收到的错误是:

“无法将类型 'System.Collections.Generic.List ' 隐式转换为 'System.Collections.Generic.List '。”

CinemaUnit 的类是:

public class CinemaUnit
{
    public string Name { get; set; }    
    public List<AttendantPoint> AttendantPoints { get; set; }
    public bool ShowPoints { get; set; }
}

CinemaUnitSchema 的类是:

public class CinemaUnitSchema
{
    public string Name { get; set; }    
    public List<AttendantPoint> AttendantPoints { get; set; }
    public bool ShowPoints { get; set; }
}

解决方案

在每次迭代中将相应的列表添加到新对象中。

谢谢,

【问题讨论】:

  • scenarioSchema.CinemaUnits.AddRange(CinemaUnitSchemas); - 您尝试将一种类型的列表添加到不同类型的列表中
  • 我该如何解决?
  • 两个列表将包含完全相同数量的数据,它实际上是列表的副本。
  • 您不能在同一个集合中添加不同类型的对象。这是强类型语言 (c#) 的好处
  • 我正在创建一个类的副本,并以不同的方式命名它。一定有办法的。看课吗?它们包含相同的属性。

标签: c#


【解决方案1】:

您可以编写一个使用反射进行浅拷贝的 Copy 方法。

void Copy(object from, object to)
{
    var dict = to.GetType().GetProperties().ToDictionary(p => p.Name, p => p);
    foreach(var p in from.GetType().GetProperties())
    {
        dict[p.Name].SetValue(to, p.GetValue(from,null), null);
    }
}

【讨论】:

  • 谢谢你。该方法在 p.GetValue() 中给我一个错误,表明“没有重载方法 'GetValue' 需要 1 个参数”。
  • @Codinghierarchy p.GetValue(from,null)我更新了答案
  • OP 已经这样做了,但是是手动的(这比通过对每个副本的反射读取属性的性能更高;))。主要问题是 OP 尝试将一种类型的集合分配给另一种类型。并且期望它应该在两种类型都具有相同名称的属性时工作 - 这在 C# 中不是这种情况。
  • 我确认 Fabio 刚才所说的话。建议的解决方案虽然性能非常好,但并不能解决我的问题。
【解决方案2】:

您真正需要的是将AttendantPoint 转换为AttendantPointSchema 的方法。

解决方案一:你可以使用 AutoMapper 框架来做。

解决方案 2:您可以像 @Eser 建议的那样编写通用转换器。

解决方案 3:您可以使用扩展方法、隐式或显式运算符为每个类手动创建转换器,或者仅使用静态函数编写辅助类。

【讨论】:

    【解决方案3】:

    不确定这是否是问题所在,但这可能是一个不错的选择。 您正在使用带有骆驼大小写 cinemaUnitsforeach 语句,但是当您尝试复制字段时,您使用的是标题大小写 CinemaUnits 而不是带有骆驼大小写的变量。

    【讨论】:

    • 感谢您的反馈,我刚刚编辑了我的问题。我以错误的方式复制并粘贴了它。那不是导致问题的错误。不过,谢谢你提出来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2021-07-14
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多