声明2个类似的匿名对象

本文关键字:对象 2个 声明 | 更新日期: 2023-09-27 18:10:22

下面是两个匿名对象的声明。第二个是与第一个完全相同的副本,只是其中没有lastRefresh元素。

是否有一种方法来声明这两个对象而不重复完全相同的部分?

var routeValuesForAutoRefresh = new
{
    page = @ViewBag.nextPage,
    lastRefresh = @ViewBag.lastRefresh,
    searchTerm = Request["searchTerm"],
    searchColumn = Request["searchColumn"],
    searchOrder = Request["searchOrder"],
    searchDescending = (Request["searchDescending"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus0 = (Request["requestStatus0"] ?? "false").ToLower().IndexOf("true") > -1,
    requestStatus1 = (Request["requestStatus1"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus3 = (Request["requestStatus3"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus5 = (Request["requestStatus5"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus7 = (Request["requestStatus7"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus9 = (Request["requestStatus9"] ?? "true").ToLower().IndexOf("true") > -1
};
var routeValuesForNextPage = new
{
    page = @ViewBag.nextPage,
    searchTerm = Request["searchTerm"],
    searchColumn = Request["searchColumn"],
    searchOrder = Request["searchOrder"],
    searchDescending = (Request["searchDescending"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus0 = (Request["requestStatus0"] ?? "false").ToLower().IndexOf("true") > -1,
    requestStatus1 = (Request["requestStatus1"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus3 = (Request["requestStatus3"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus5 = (Request["requestStatus5"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus7 = (Request["requestStatus7"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus9 = (Request["requestStatus9"] ?? "true").ToLower().IndexOf("true") > -1
};

声明2个类似的匿名对象

没有相应的语法,但您有几个不错的解决方案:

  • 让你的类命名,并从另一个类派生(或从一个共同的基派生)
  • 使用公共字段创建第三个匿名对象,然后在两个"真正的"命名对象中使用它
  • 创建单独的局部变量,并使用它们创建两个匿名对象的字段。

我更喜欢第一种方法,但另外两种方法将是一种改进。

下面是第二种方法的例子:

var routeValuesForNextPage = new
{
    page = @ViewBag.nextPage,
    searchTerm = Request["searchTerm"],
    searchColumn = Request["searchColumn"],
    searchOrder = Request["searchOrder"],
    searchDescending = (Request["searchDescending"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus0 = (Request["requestStatus0"] ?? "false").ToLower().IndexOf("true") > -1,
    requestStatus1 = (Request["requestStatus1"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus3 = (Request["requestStatus3"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus5 = (Request["requestStatus5"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus7 = (Request["requestStatus7"] ?? "true").ToLower().IndexOf("true") > -1,
    requestStatus9 = (Request["requestStatus9"] ?? "true").ToLower().IndexOf("true") > -1
};
var routeValuesForAutoRefresh = new {
    routeValuesForNextPage
,   lastRefresh = @ViewBag.lastRefresh
};

下面是第三种方法的例子:

var page = @ViewBag.nextPage;
var searchTerm = Request["searchTerm"];
var searchColumn = Request["searchColumn"];
var searchOrder = Request["searchOrder"];
var searchDescending = (Request["searchDescending"] ?? "true").ToLower().IndexOf("true") > -1;
var requestStatus0 = (Request["requestStatus0"] ?? "false").ToLower().IndexOf("true") > -1;
var requestStatus1 = (Request["requestStatus1"] ?? "true").ToLower().IndexOf("true") > -1;
var requestStatus3 = (Request["requestStatus3"] ?? "true").ToLower().IndexOf("true") > -1;
var requestStatus5 = (Request["requestStatus5"] ?? "true").ToLower().IndexOf("true") > -1;
var requestStatus7 = (Request["requestStatus7"] ?? "true").ToLower().IndexOf("true") > -1;
var requestStatus9 = (Request["requestStatus9"] ?? "true").ToLower().IndexOf("true") > -1;
var routeValuesForAutoRefresh = new {
    page,
    lastRefresh = @ViewBag.lastRefresh,
    searchTerm,
    searchColumn,
    searchOrder,
    searchDescending,
    requestStatus0,
    requestStatus1,
    requestStatus3,
    requestStatus5,
    requestStatus7,
    requestStatus9
};
var routeValuesForNextPage = new {
    page,
    searchTerm,
    searchColumn,
    searchOrder,
    searchDescending,
    requestStatus0,
    requestStatus1,
    requestStatus3,
    requestStatus5,
    requestStatus7,
    requestStatus9
};

我的问题是:有没有一种方法可以声明这两个对象,而不需要复制完全相同的部分?

当然,使用常规类

实现一个包含共享属性的类RouteValues,并实现继承RouteValues的派生类以添加更多属性

如果你担心必须使用点语法(即values.whatever = "hello world";)逐个设置每个属性,你可以使用类型初始化器:

RouteValues values = new RouteValues
{
    page = @ViewBag.nextPage
};