我将如何创建ReturnAlteredObject扩展方法?

时间:2013-08-28 15:38:14

标签: c# clone extension-methods

TL; DR:我想要一个可以扩展对象的扩展方法,可以像这样使用:

var OtherInstance = MyObject.Altered(new { Prop1 = "123", Prop6 = 4 });

除了OtherInstanceMyObject之外,我希望Prop1的所有属性都与Prop6相同。我不希望/要求它进行深度克隆。


背景

我有一个MVC页面,允许用户搜索以显示数据列表。

我的页面模型具有各种过滤器属性以及页码。

在我的数据列表的底部,我有一个指向使用Html.ActionLink创建的下一页的链接。我传入了模型的副本,页码递增:

<%= Html.ActionLink("Next", "Index", new
{
    Page = (Model.Page ?? -1) + 1,
    Model.SortProperties,
    Model.SortDescending,
    Model.FilterId,
    Model.FilterApprovalsLevelId,
    Model.FilterStandardTypeId,
    Model.FilterApprovalsBodyReferenceNumber,
    Model.FilterCertificateOrApprovalNumber
}, new { id = "next-page" })%>

如果我在模型中添加新的过滤器,很容易忘记在这里添加属性,所以我希望能够克隆对象并流畅地改变1或2个属性,如下所示:

<%= Html.ActionLink("Next", "Index", Model.Altered(new
{
    Page = (Model.Page ?? -1) + 1
}), new { id = "next-page" })%>

1 个答案:

答案 0 :(得分:0)

您可以使用RouteValueDictionary类来实现。首先从模型创建RouteValueDictionary的实例和实例,然后添加到字典中,这里的其余属性是伪代码:

<%= Html.ActionLink("Next", "Index", new RouteValueDictionary(Model).AddAndReturn("Page", (Model.Page ?? -1) + 1), new { id = "next-page" })%>