Перебирать свойства [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>
<#        
                }
            }
        }
    }
#>

Это загружает сборку сложного типа с использованием отражения и не требует ссылки. Когда у вас есть это, вы можете получить тип и перебрать свойства.

Другие вопросы по тегам