Я использовал T4 текстовые шаблоны , включенные в Visual Studio. Моя цель состояла в том, чтобы уменьшить объем кода, который мне нужно было написать вручную, чтобы было меньше шансов ошибиться, например, при копировании / вставке кода.
В моем проекте есть типы CircleVertex
, SquareVertex
и TriangleVertex
, каждый из которых имеет отдельные fillColor
и strokeColor
. Это можно считать вложенным l oop, и T4 позволяет записать его таким образом.
В качестве примера, вот код, который я в итоге использовал. Соответствующие части синтаксиса в том, что в <# ... #>
есть код C#, а <#= foo #>
заменяется значением foo
при обнаружении этой строки.
<#
String[] shapes = new String[] {"Circle","Square","Triangle"};
String[] colors = new String[] {"fillColor", "strokeColor"};
foreach(var shape in shapes){
foreach(var color in colors){
#>
[XmlElement(Type = typeof(XmlColor))]
public Color <#=shape#>_<#=color#>
{
get => <#=shape#>Vertex.<#=color#>;
set => <#=color#>Vertex.<#=shape#> = value;
}
<#}#>
Это расширяется до:
[XmlElement(Type = typeof(XmlColor))]
public Color Circle_fillColor
{
get => CircleVertex.fillColor;
set => CircleVertex.fillColor = value;
}
[XmlElement(Type = typeof(XmlColor))]
public Color Circle_strokeColor
{
get => CircleVertex.strokeColor;
set => CircleVertex.strokeColor = value;
}
[XmlElement(Type = typeof(XmlColor))]
public Color Square_fillColor
{
get => SquareVertex.fillColor;
set => SquareVertex.fillColor = value;
}
...snip...
[XmlElement(Type = typeof(XmlColor))]
public Color Triangle_strokeColor
{
get => TriangleVertex.strokeColor;
set => TriangleVertex.strokeColor = value;
}