Выкладываю свой вариант, вдруг кому пригодится. Реализован на MVC3 Razor. Здесь рассматриваются только те типы, которые мне понадобились, можно расширить добавив DataTable,DataRow и т.д.
@using System.Collections
@model dynamic
@helper ShowEnumerable(dynamic lst)
{
foreach (dynamic item in lst)
{
@SwitchViewData(item)
}
}
@helper ShowProperties(dynamic item)
{
var properties = item.GetType().GetProperties();
<table border="1" cellpadding="0" cellspacing="0">
@foreach (dynamic property in properties)
{
//если это класс сгенерированный Linq2SQL то рассматриваем только колонки с атрибутом [ColumnAttribute]
//у осатльных рассматриваем все
var attributes = property.GetCustomAttributes(true);
bool isColumnAttr = false;
foreach (var attribute in attributes)
{
if (attribute.ToString().Contains("ColumnAttribute"))
{
isColumnAttr = true;
}
}
if (isColumnAttr || attributes.Length == 0)
{
<tr>
<td>
@property.Name
</td>
<td>
@SwitchViewData(property.GetValue(item, null) ?? "")
</td>
</tr>
}
}
</table>
<br />
}
@helper SwitchViewData(dynamic data)
{
if (data is string)
{
@data<br />
}
else
{
if (data is IEnumerable)
{
@ShowEnumerable(data)
}
else if (data.GetType().GetProperties().Length > 0)
{
@ShowProperties(data)
}
else
{
@data<br />
}
}
}
@SwitchViewData(Model)