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
时,我修改了两个属性。为什么不修改传入对象的属性呢?通过创建一个新实例来防止什么问题?请注意:更改输入参数的状态通常是不好的做法。调用者不希望出现这种情况,这可能会导致以后出现一些难以跟踪的错误,因为它破坏了输入参数的封装。