How to get properties from a dynamic object (anonymous type) using reflection?

I know that there are many questions asked on this topic in stackoverflow, but I did not find a specific answer to my current situation.

  • I have a dynamically created rowset.
  • Property names (columns and number of columns) are known only at run time.
  • I have the following code,
// collection gets populated at run time, the type T is dynamic.
public void GenerateExcel<T>(string filename, IEnumerable<T> collection)
{
    // Since the T passed is dynamic Type I am facing issues in getting
    // the property names.
    var type = typeof(T); // the type T is an anonymous type, and thus
                          // the 'type' variable is always an Object type.
    var columns = type.GetProperties().Length; // when I run this line it
                                               // is obvious the properties 
                                               // returned is always 0 so how
                                               // do I get the properties?

    /* Implementation omitted */
}
  1. I call the above method using the code below,
GenerateExcel<dynamic>(
 "filename.xls",
 new[] { 
  new { Obj1 = "a", Obj2 = 1, Obj3 = 3.1, Obj4 = new DateTime(2014, 1, 1) }, 
  new { Obj1 = "b", Obj2 = 2, Obj3 = 3.2, Obj4 = new DateTime(2014, 1, 2) },
  new { Obj1 = "c", Obj2 = 3, Obj3 = 3.3, Obj4 = new DateTime(2014, 1, 3) },
  new { Obj1 = "d", Obj2 = 4, Obj3 = 3.4, Obj4 = new DateTime(2014, 1, 4) },
 }); // these objects (Obj1, Obj2 ... (columns) are generated dynamically at run time).

The same question was asked several times, here on stackoverflow, but the solution only happens when you know the property names, for example

!

+4
2

, , :

object e = collection.FirstOrDefault();
var columns = e.GetType().GetProperties().Length;

:

collection.FirstOrDefault().GetType().GetProperties().Length;
+3

?

 dynamic dy = obj;
 Console.WriteLine(d.param);
0

Source: https://habr.com/ru/post/1526668/


All Articles