声明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
};
没有相应的语法,但您有几个不错的解决方案:
- 让你的类命名,并从另一个类派生(或从一个共同的基派生)
- 使用公共字段创建第三个匿名对象,然后在两个"真正的"命名对象中使用它
- 创建单独的局部变量,并使用它们创建两个匿名对象的字段。
我更喜欢第一种方法,但另外两种方法将是一种改进。
下面是第二种方法的例子:
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
};