Bronzato
Bronzato

Reputation: 9362

Declaring 2 similar anonymous objects

Below is the declaration of 2 anonymous objects. The second one is the exact same copy of the first one except there is no lastRefresh element inside it.

Is there a way to declare these 2 objects without duplicating the exact same portion?

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
};

Upvotes: 4

Views: 58

Answers (2)

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 727047

There is no syntax for it, but you have a couple of decent workarounds:

  • Make your class named, and derive one from the other (or derive both from a common base)
  • Make a third anonymous object with the common fields, then use it in both "real" named objects
  • Make individual local variables, and use them to make fields of both anonymous objects.

I would prefer the first approach, but the other two approaches would be an improvement.

Here is an example of the second approach:

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
};

Here is an example of the third approach:

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
};

Upvotes: 1

Matías Fidemraizer
Matías Fidemraizer

Reputation: 64943

My question: is there a way to declare these 2 objects without duplicating the exact same portion ?

Of course, using regular classes.

Implement a class RouteValues which should contain shared properties and also implement derived classes which inherit RouteValues to add more properties.

If you're worried about having to set each property one by one using dot syntax (i.e. values.whatever = "hello world";), you can use type initializers:

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

Upvotes: 0

Related Questions