Шаблон FieldWrapper ⇐ C#
-
Anonymous
Шаблон FieldWrapper
У меня был класс, похожий на этот, который в основном предназначен для переноса базового типа (int, long, bool, string, ...) и отслеживания того, был ли он изменен или нет.
публичный класс FieldWrapper { public bool HasBeenModified = false; частный T _value; общедоступное значение T { получать { вернуть _значение; } набор { if ((_value == null && value != null) || (_value != null && !_value.Equals(value))) { this.HasBeenModified = правда; _value = значение; } } } } и я использовал это так:
публичный класс MyClass { общедоступный FieldWrapper только для чтения a = новый FieldWrapper(); общедоступный FieldWrapper b = новый FieldWrapper(); публичная недействительность DoThings() { а.Значение = 2+1; б.Значение = а.Значение; } } но мне очень не нравилось, что этот .value распространяется повсюду, поэтому я решил создать несколько неявных приведений и добавил следующие строки:
публичный статический неявный оператор T (значение FieldWrapper) { возвращаемое значение.Значение; } общедоступный статический неявный оператор FieldWrapper(значение T) { return new FieldWrapper() { Value = value, HasBeenModified = true }; } и это почти всё прекрасно и прекрасно, но вещь.
публичный класс MyClass { public FieldWrapper a = новый FieldWrapper(); public FieldWrapper b = новый FieldWrapper(); публичная недействительность DoThings() { а = 2+1; б = а; } } Теперь a = 2+1 фактически является присвоением новому объекту, и переменная больше не может быть доступна только для чтения. b = a теперь работает иначе, чем в предыдущей версии: он копирует ссылку a в b и, таким образом, его поле HasBeenModified. .
Можно ли каким-то образом исправить этот шаблон FieldWrapper, который мне не хватает?
Изменить:
Контекст и то, чего я хочу достичь.
У меня есть ряд классов, структура (поля) которых отражается в базе данных. Например, если есть
класс DbClass1 { [Дбфилдаттрибуте] public FieldWrapper exampleField; } тогда в базе данных также есть таблица под названием «DbClass1», которая имеет «exampleField» в качестве целочисленного столбца. Этот класс считывается и сохраняется в базе данных с помощью автоматически создаваемых запросов. Я хотел избежать ненужных запросов UPDATE, когда объект не менялся с момента последней загрузки.
И, возможно, обновлять только те поля, которые действительно изменились (я переосмысливаю эту часть, поскольку для коллекции элементов массовое обновление, вероятно, более эффективно, чем одиночные точечные обновления, а для одиночных обновлений выигрыш составляет вероятно, не стоит усилий по усложнению кода).
Итак, мне просто нужно логическое значение для класса (а не для каждого отдельного поля), чтобы сигнализировать, нужно ли обновлять этот объект/запись или в этом нет необходимости.
моя первая догадка была бы такой: класс DbClass1 { частный bool hasBeenModified = false;
int _exampleField; [Дбфилдаттрибуте] public int exampleField { получать { вернуть поле примера; } набор { if() //проверяем, отличается ли старое значение от нового значения { hasBeenModified = правда; _exampleField= значение; } } } } если есть более компактный способ сделать это, это было бы идеально
У меня был класс, похожий на этот, который в основном предназначен для переноса базового типа (int, long, bool, string, ...) и отслеживания того, был ли он изменен или нет.
публичный класс FieldWrapper { public bool HasBeenModified = false; частный T _value; общедоступное значение T { получать { вернуть _значение; } набор { if ((_value == null && value != null) || (_value != null && !_value.Equals(value))) { this.HasBeenModified = правда; _value = значение; } } } } и я использовал это так:
публичный класс MyClass { общедоступный FieldWrapper только для чтения a = новый FieldWrapper(); общедоступный FieldWrapper b = новый FieldWrapper(); публичная недействительность DoThings() { а.Значение = 2+1; б.Значение = а.Значение; } } но мне очень не нравилось, что этот .value распространяется повсюду, поэтому я решил создать несколько неявных приведений и добавил следующие строки:
публичный статический неявный оператор T (значение FieldWrapper) { возвращаемое значение.Значение; } общедоступный статический неявный оператор FieldWrapper(значение T) { return new FieldWrapper() { Value = value, HasBeenModified = true }; } и это почти всё прекрасно и прекрасно, но вещь.
публичный класс MyClass { public FieldWrapper a = новый FieldWrapper(); public FieldWrapper b = новый FieldWrapper(); публичная недействительность DoThings() { а = 2+1; б = а; } } Теперь a = 2+1 фактически является присвоением новому объекту, и переменная больше не может быть доступна только для чтения. b = a теперь работает иначе, чем в предыдущей версии: он копирует ссылку a в b и, таким образом, его поле HasBeenModified. .
Можно ли каким-то образом исправить этот шаблон FieldWrapper, который мне не хватает?
Изменить:
Контекст и то, чего я хочу достичь.
У меня есть ряд классов, структура (поля) которых отражается в базе данных. Например, если есть
класс DbClass1 { [Дбфилдаттрибуте] public FieldWrapper exampleField; } тогда в базе данных также есть таблица под названием «DbClass1», которая имеет «exampleField» в качестве целочисленного столбца. Этот класс считывается и сохраняется в базе данных с помощью автоматически создаваемых запросов. Я хотел избежать ненужных запросов UPDATE, когда объект не менялся с момента последней загрузки.
И, возможно, обновлять только те поля, которые действительно изменились (я переосмысливаю эту часть, поскольку для коллекции элементов массовое обновление, вероятно, более эффективно, чем одиночные точечные обновления, а для одиночных обновлений выигрыш составляет вероятно, не стоит усилий по усложнению кода).
Итак, мне просто нужно логическое значение для класса (а не для каждого отдельного поля), чтобы сигнализировать, нужно ли обновлять этот объект/запись или в этом нет необходимости.
моя первая догадка была бы такой: класс DbClass1 { частный bool hasBeenModified = false;
int _exampleField; [Дбфилдаттрибуте] public int exampleField { получать { вернуть поле примера; } набор { if() //проверяем, отличается ли старое значение от нового значения { hasBeenModified = правда; _exampleField= значение; } } } } если есть более компактный способ сделать это, это было бы идеально
Мобильная версия