Очень простой способ сделать то, что вы хотите, может выглядеть следующим образом. Я обновил его списком лиц, как определено в моем коде. Обратите внимание, что я также включил класс, производный от Person, чтобы вы могли видеть другие свойства.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Reflection;
public partial class _Default : System.Web.UI.Page
{
public class Person
{
public string Name { get; set; }
public string Title { get; set; }
}
public class WorkingPerson : Person
{
public string Job { get; set; }
}
protected void Page_Load(object sender, EventArgs e)
{
List<Person> people = new List<Person>();
people.Add(new Person() {Name = "T", Title = "Mr" }) ;
people.Add(new WorkingPerson() {Name="Face", Title="Mr", Job ="Film Star" } );
TextBox textBox = new TextBox();
Controls.Add(CreateTableFromObject<Person>(people));
}
public PlaceHolder CreateTableFromObject<T>(IEnumerable<T> objectList) where T : Person
{
PlaceHolder holder = new PlaceHolder();
foreach (T thing in objectList)
{
Table table = new Table();
PropertyInfo[] properties = thing.GetType().GetProperties();
TableRow propertiesSpan = new TableRow();
propertiesSpan.Cells.Add(new TableCell() { ColumnSpan = properties.Length, Text = String.Format("Properties of {0}", thing.GetType().FullName) });
table.Rows.Add(propertiesSpan);
TableRow tableRow = new TableRow();
foreach (PropertyInfo propertyInfo in properties)
{
TableCell tc = new TableCell();
tc.Text = propertyInfo.Name;
tableRow.Cells.Add(tc);
}
table.Rows.Add(tableRow);
holder.Controls.Add(table);
}
return holder;
}
}
Это эффективно берет объект, использует отражение, чтобы обнаружить его свойства, а затем записывает их в ячейки таблицы. Вы можете изменить подпись так, чтобы она принимала вашу пользовательскую коллекцию, и изменить внутренние компоненты для отображения вашей таблицы.