6

How can I loop through a List of type Object?

List<object> countries = new List<object>();
countries.Add(new { Name = "United States", Abbr = "US" , Currency = "$"});
countries.Add(new { Name = "Canada", Abbr = "CA", Currency = "$" });
...more

I want to do something like (using property names) in my view

@model ViewModel
@foreach(object country in Model.Countries)
{
    Name = country.Name
    Code = country.Abbr
    Currency = country.Currency
}

UPDATE: Forgot to mention that I am using MVC and I want to loop the data in View. Countries object is one of the property of ViewModel to view is strongly typed.

UPDATE: updating as asked to show how View is called from the controller -

[HttpPost]
public ActionResult Index(FormCollection form)
{
..some validations and some logic
ViewModel myViewModel = new ViewModel();
myViewModel.Countries = GetCountries(); -- this is where data get initialized
myViewModel.Data = db.GetData();
return PartialView("_myPartial", myViewModel);
}
6

6 Answers 6

9
var countries = new []{
        new { Name = "United States", Abbr = "US", Currency = "$" },
        new { Name = "Canada", Abbr = "CA", Currency = "$" }
    };

foreach(var country in countries)
{
      var Name = country.Name;
      .....
}
Sign up to request clarification or add additional context in comments.

Comments

3

If I understood well, you are trying to send the view model from the controller to the view. So if you are using razor your code should be like this

@model ViewModel
@foreach(object country in Model.countries)
{
  var Name = country.Name
  var Code = country.Abbr
  var Currency = country.Currency
}

notice the keyword Model.

Edit

// Code inside your controller should be like this
ViewModel myModel = new ViewModel();
List<object> countries = new List<object>();
countries.Add(new { Name = "United States", Abbr = "US" , Currency = "$"});
countries.Add(new { Name = "Canada", Abbr = "CA", Currency = "$" });

myModel.countries = countries;

return View("yourView", myModel); // you can write just return View(myModel); if your view's name is the same as your action 

Hope it helps you.

10 Comments

I am not very clear here. Model is referring to ViewModel which has one property as Countries. Then how would it recognize Countries list. I tried your example I get 'object' does not contain a definition for 'Name' and no extension method 'Name' accepting a first argument of type 'object' could be found.
Can you put the code you are using to call your view from the controller ?
You are returning an object when your action should return an ActionResult. Change the return insruction to look like mine and you will be fine ;)
Seems like the similar code that I have. I noticed the Model keyword. That is what I have. It was typo in my original question. Sorry about that.
So the problem is related to using the type Object, try to create your own class Country wich has all the properties you need ("Name" ...)
|
3

You need to make countries anonymous too.

As an exaplme, something like

var countries = (new[] {
    new { Name = "United States", Abbr = "US", Currency = "$" },
    new { Name = "Canada", Abbr = "CA", Currency = "$" },
 });
 List<string> names = new List<string>();
 countries.ToList().ForEach(x => { names.Add(x.Name); });

Comments

1

I would just create a new class, and use that instead of the generic object. Is there a reason that it needs to use the base level object? If more abstraction is needed you could utilize an anonymous type with a Where clause or use an abstract class.

Comments

1

The way you defined your objects leaves dynamic as your only option: the two anonymous classes are of different type. You should either write

foreach (dynamic country in countries) {
    ...
}

or initialize your list with instances of a named class (this is preferred, because dynamic may be too heavy in your situation).

1 Comment

+1 because you're right, but dynamic is not a keyword to use lightly. The OP should probably just define a simple struct type for countries.
0

If you want to work with the polymorphic items somehow (and not with anonymous types) take a look at Cast<...>.ToList() or OfType<...>.ToList()

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.