C# 如何在不创建新实例的情况下修改传入对象的属性?

C# 如何在不创建新实例的情况下修改传入对象的属性?,c#,linq,C#,Linq,我想修改传入对象的属性。如何在不创建新实例的情况下执行此操作 我有一节课 public class Report : IReport<ReportItem> { public Report() { Items = new ReportItemsCollection(); } public Report(IEnumerable<ReportItem> items) { Items = new Repo

我想修改传入对象的属性。如何在不创建新实例的情况下执行此操作

我有一节课

public class Report : IReport<ReportItem>
{
    public Report()
    {
        Items = new ReportItemsCollection();
    }

    public Report(IEnumerable<ReportItem> items)
    {
        Items = new ReportItemsCollection(items);
    }

    [DataMember(Name = "items")]
    public ReportItemsCollection Items { get; private set; }

    IEnumerable<ReportItem> IReport<ReportItem>.Items
    {
        get { return Items; }
    }
}
公共类报告:IReport
{
公开报告(
{
Items=新报告ItemsCollection();
}
公共报告(IEnumerable items)
{
项目=新报告项目集合(项目);
}
[DataMember(Name=“items”)]
public reportItems集合项{get;private set;}
IEnumerable IReport.Items
{
获取{返回项;}
}
}
和两种方法

private static Report ConvertReportItems(Report report)
{
    var reportData = report.Items.Select(BackwardCompatibilityConverter.FromOld);
    return new Report(reportData);
}

public static ReportItem FromOld(ReportItem reportItem)
{
    reportItem.AgentIds = new List<Guid> { reportItem.AgentId };
    reportItem.AgentNames = new List<string> { reportItem.Agent };

    return reportItem;
}
私有静态报表ConvertReportItems(报表)
{
var reportData=report.Items.Select(BackwardCompatibilityConverter.FromOld);
返回新报告(reportData);
}
公共静态ReportItem FromOld(ReportItem ReportItem)
{
reportItem.AgentId=新列表{reportItem.AgentId};
reportItem.AgentNames=新列表{reportItem.Agent};
退货报告项目;
}

确保
报告
允许您设置其属性。我假设你有一个
Data
属性或者类似的东西,它有一个setter

private static void ConvertReportItems(Report report)
{
    report.Data = report.Items.Select(BackwardCompatibilityConverter.FromOld)
        .ToList();
}

确保
Report
允许您设置其属性。我假设你有一个
Data
属性或者类似的东西,它有一个setter

private static void ConvertReportItems(Report report)
{
    report.Data = report.Items.Select(BackwardCompatibilityConverter.FromOld)
        .ToList();
}

听起来好像您正试图用Linq更新集合中每个对象的属性。Linq用于查询,而不是更新。如果要更新集合中的项目,必须循环:

foreach(ReportItem item in report.Items)
{
   // update item
}

您是否应该这样做是另一个问题,但机械地说,这就是您应该如何做。

听起来好像您正在尝试使用Linq更新集合中每个对象的属性。Linq用于查询,而不是更新。如果要更新集合中的项目,必须循环:

foreach(ReportItem item in report.Items)
{
   // update item
}

您是否应该这样做是另一个问题,但机械地说,这就是您应该如何做。

您需要对此进行更多解释。我有点不清楚,但类似于
reportData.Items=report.Items.Select(BackwardCompatibilityConverter.FromOld)将更改现有项而不创建新项。不确定这是否真的有效当然不知道你的对象结构,但你知道要点。如果你想修改一个属性,为什么要创建一个新实例?什么是
报告
?您需要进一步解释您的问题。当我调用
BackwardCompatibilityConverter.FromOld
时,我修改了两个属性。为什么不修改传入对象的属性呢?通过创建一个新实例来防止什么问题?请注意:更改输入参数的状态通常是不好的做法。调用者不希望出现这种情况,这可能会导致以后难以跟踪错误+它会破坏输入参数的封装。您需要对此进行更多解释。我有点不清楚,但类似于
reportData.Items=report.Items.Select(BackwardCompatibilityConverter.FromOld)将更改现有项而不创建新项。不确定这是否真的有效当然不知道你的对象结构,但你知道要点。如果你想修改一个属性,为什么要创建一个新实例?什么是
报告
?您需要进一步解释您的问题。当我调用
BackwardCompatibilityConverter.FromOld
时,我修改了两个属性。为什么不修改传入对象的属性呢?通过创建一个新实例来防止什么问题?请注意:更改输入参数的状态通常是不好的做法。调用者不希望出现这种情况,这可能会导致以后出现一些难以跟踪的错误,因为它破坏了输入参数的封装。