Есть ли сокращение для "сквозных" свойств в C#? - PullRequest
0 голосов
/ 06 января 2020

Я реализую функцию «сохранить / загрузить» в моем приложении. Существуют различные типы объектов Vertex, которые имеют много полей stati c, но , очевидно, , вы не можете сериализовать поля stati c. Я делаю класс, экземпляр которого содержит эти поля, и чтобы избежать слишком большого кода для заполнения этих полей, я реализую их как свойства.

Однако синтаксис для этого кажется слишком громоздким, поэтому я ищу способ упростить это:

public Color CircleFillColor { get => CircleVertex.fillColor; set => CircleVertex.fillColor = value; }
public Color SquareFillColor { get => SquareVertex.fillColor; set => SquareVertex.fillColor = value; }
public Color TriangleFillColor { get => TriangleVertex.fillColor; set => TriangleVertex.fillColor = value; }

Если бы у нас было макросов в C#, я мог бы написать что-то вроде этого:

#define passthru(F) { get => F; set => F = value; }
public Color CircleFillColor passthru(CircleVertex.fillColor)
public Color SquareFillColor passthru(SquareVertex.fillColor)
public Color TriangleFillColor passthru(TriangleVertex.fillColor)

Есть ли сокращение для свойств, подобных этому?

Ответы [ 2 ]

1 голос
/ 06 января 2020

Нет прямого эквивалента макросам. Альтернативой может быть инкапсуляция вызовов, которая дает минимально более короткие свойства за счет двух дополнительных методов и перемещает затронутое свойство fillColor в один метод каждый вместо того, чтобы повторять его дважды в каждом свойстве.

public Color CircleFillColor { get => GetColor(CircleVertex); set => SetColor(CircleVertex, value); }
public Color SquareFillColor { get => GetColor(SquareVertex); set => SetColor(SquareVertex, value); }
public Color TriangleFillColor { get => GetColor(TriangleVertex); set => SetColor(TriangleVertex, value); }

private Vertex GetColor(Vertex vertex)
{
  return vertex.fillColor;
}

private void SetColor(Vertex vertex, Color color)
{
  vertex.fillColor = color;
}
0 голосов
/ 12 января 2020

Я использовал 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...