Перебирать свойства [ComplexType] в скаффолдинге T4?
Я настраиваю шаблоны Entity Framework ASP.NET CRUD, используемые для Add=>New Scaffolded Item...=>"Контроллер MVC 5 с представлениями, используя Entity Framework". Я также использую атрибут [ComplexType] с классами, которые используются для свойств сущности (например, класс [ComplexType] FullName используется для свойства SpouseFullName в моем классе сущностей Customer).
public class Customer
{
public string CustomerNumber { get; set; }
public FullName SpouseFullName { get; set; }
}
[ComplexType]
public class FullName
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public FullName()
{
FirstName = "";
MiddleName = "";
LastName = "";
}
}
Я хотел бы иметь возможность перебирать метаданные свойства для каждого свойства в моем [ComplexType] при создании леса. Например:
<#
IEnumerable<PropertyMetadata> properties = ModelMetadata.Properties;
foreach (PropertyMetadata property in properties)
{
// Is this a [ComplexType]?
if(property.IsComplexType)
{
// Iterate over metatdata here.
}
}
В идеале я хотел бы иметь возможность получить IEnumerable<PropertyMetadata>
свойств, содержащихся в моем [ComplexType]. Идеи?
1 ответ
Догадаться. Я надеялся на что-то более элегантное, но это работает:
<#
IEnumerable<PropertyMetadata> properties = ModelMetadata.Properties;
foreach (PropertyMetadata property in properties)
{
if(property.IsComplexType)
{
System.Reflection.Assembly myAssembly = System.Reflection.Assembly.LoadFile("C:\\myFullAssemblyPath\\bin\\Release\\myAssembly.dll");
Type myType = myAssembly.GetType(property.TypeName);
if(myType == null)
{
#>
<th>TODO: Unable to render complex type (cannot load class from assembly). </th>
<#
}
else
{
foreach(var currentComplexProperty in myType.GetProperties())
{
string fullComplexName = property.PropertyName + "." + currentComplexProperty.Name;
#>
<th id="<#= fullComplexName #>">
<#= fullComplexName #>
</th>
<#
}
}
}
}
#>
Это загружает сборку сложного типа с использованием отражения и не требует ссылки. Когда у вас есть это, вы можете получить тип и перебрать свойства.