Question

Okay so I have a small section of code which creates a list of objects based on the data model. I don't want to have to create a class for this. It is used on n ASP.net MVC application for populating a user notifications list.

I know there are plenty of other ways to do this such as actually setting up a class for it(probably the easiest method), but I would like to know if there is a way to do what is displayed below.

        List<object> notificationList = new List<object>();

        object userNotification = new { Text = "Here is some text!", Url = "http://www.google.com/#q=notifications" };
        notificationList.Add(userNotification);


        foreach(object notification in notificationList)
        {
            string value = notification.Text;
        }    

So I haven't populated the list much but for the purposes here you get the idea. After debug I notice that the Text and Url properties exist, however cannot code to get the values???

Was it helpful?

Solution

You need to use dynamic as variable type in the foreach:

foreach(dynamic notification in notificationList)
{
    string value = notification.Text;
}   

OTHER TIPS

Edit Oops ... you do need "dynamic", either as the List's generic type, or in the foreach.

      var notificationList = new List<dynamic>();

      var userNotification = new { Text = "Here is some text!", Url = "http://www.google.com/#q=notifications" };
      notificationList.Add(userNotification);


      foreach (var notification in notificationList)
      {
        string value = notification.Text;
      }    

End edit

Anonymous types should be declared using the var keyword:

var userNotification = new { Text = "Here is some text!", Url = "http://www.google.com/#q=notifications" };

You could also use "dynamic" instead of "var", but that deprives you of compile-time checks, and it appears unnecessary in this case (because the type is fully defined at compile time, within the same method scope). A case where you would need to use "dynamic" is where you want to pass the anonymous-typed object as a parameter to another function, eg:

void Func1()
{
    var userNotification = new { Text = "Here is some text!", Url = "http://www.google.com/#q=notifications" };
    Func2(userNotification);
}

void Func2(dynamic userNotification)
{
    string value = notification.Text;
}

Well you could declare the list as an list of dynimac objects:

    List<dynamic> notificationList = new List<object>();

    var userNotification = new { Text = "Here is some text!", Url = "http://www.google.com/#q=notifications" };
    notificationList.Add(userNotification);

    foreach(dynamic notification in notificationList)
    {
        string value = notification.Text;
    }  

or use var to let the compiler choose the type:

    var notificationList = new [] 
              {
                   new { Text = "Here is some text!", Url = "http://www.google.com/#q=notifications" }
              }.ToList();

    foreach(var notification in notificationList)
    {
        string value = notification.Text;
    }   
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top