迭代 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>
<#
}
}
}
}
#>
这使用反射加载了复杂类型的程序集,不需要引用。一旦你有了它,你就可以获取类型并迭代属性。
我正在自定义 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>
<#
}
}
}
}
#>
这使用反射加载了复杂类型的程序集,不需要引用。一旦你有了它,你就可以获取类型并迭代属性。