迭代 T4 脚手架中的 [ComplexType] 属性?

Iterating over [ComplexType] properties in T4 scaffolding?

我正在自定义 Entity Framework ASP.NET CRUD 模板,用于添加=>新脚手架项目...=>“带视图的 MVC 5 控制器,使用 Entity Framework”。我还将 [ComplexType] 属性与用于实体属性的 classes 一起使用(例如,[ComplexType] FullName class 用于我的 Customer 实体中的 SpouseFullName 属性 class).

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.
    }
}

理想情况下,我希望能够获得我的 [ComplexType] 中包含的 IEnumerable<PropertyMetadata> 个属性。想法?

想通了。我希望有更优雅的东西,但这行得通:

<#
    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>
<#        
                }
            }
        }
    }
#>

这使用反射加载了复杂类型的程序集,不需要引用。一旦你有了它,你就可以获取类型并迭代属性。