Свойства с идентичными методами доступаC#

Место общения программистов C#
Ответить
Anonymous
 Свойства с идентичными методами доступа

Сообщение Anonymous »

У нас есть несколько больших классов с десятками свойств с простыми методами доступа, которые в основном идентичны:

Код: Выделить всё

public struct ObservableField
{
internal T Val;
public ObservableFile(T val) => this.Val ) val;
...
}

public class DataConfiguration
{
private ObservableField isEnabled;
public bool IsEnabled
{
get => GetValue( ref isEnabled, nameof(IsEnabled));
set
{
if(SetValue( ref isEnabled, nameof(IsEnabled), value))
OnDataChanged(nameof(IsEnabled));
}
}

private ObservableField dataWrapMode;
public bool DataWrapMode
{
get => GetValue( ref dataWrapMode, nameof(DataWrapMode));
set
{
if(SetValue( ref dataWrapMode, nameof(DataWrapMode), value))
OnDataChanged(nameof(DataWrapMode));
}
}

...
}
Причина, по которой мы хотим это изменить, состоит в том, чтобы сделать его более кратким и менее подверженным ошибкам, поскольку база кода предшествует C#4. Итак, имя отсутствует, и были ошибки копирования и вставки:

Код: Выделить всё

  private ObservableField dirty;
public bool Dirty
{
get => GetValue( ref dirty, "Dirty");
set
{
if(SetValue( ref dirty, "Dirty", value))
OnDataChanged(**"IsEnabled"**);
}
}
Мы ищем решение, желательно с генерацией кода T4. Изменение ObservableField сейчас не вариант, так как он широко распространен во всей базе кода, и есть некоторые свойства этого типа, которые требуют другой обработки.
Я также не могу использовать для этого оболочку, так как их много. магии с атрибутами и отражением, позволяющими обнаружить свойства в том виде, в каком они показаны в графическом интерфейсе.
с макросами в стиле C это было бы просто (но не красиво и не идиоматично):

Код: Выделить всё

#define OBSERVABLE_WITH_ACCESSORS(name,type) \
private ObservableField _##name; \
public ##type ##name \
{ \
get => GetValue( ref _##name, nameof(##name)); \
set \
{ \
if(SetValue( ref _##name, nameof(##name), value)) \
OnDataChanged(nameof(##name)); \
} \
}
Как это можно сделать предпочтительно в C#-8.0?
если это невозможно легко сделать в C#-8.0, предложения по более новым стандартам также приемлемы, поскольку мы намерены перейти в будущем.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -accessors
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»