Я пытаюсь создать класс для использования в качестве поля в других объектах, которые могут содержать временное несохраненное значение до тех пор, пока для объекта не будет вызван метод SaveChanges, чтобы я мог передать значение в сохраненную процедуру, которая обновит любые несохраненные значения. -null поля с новым значением и оставить поля с нулевым значением в качестве исходных значений.
Я хочу уметь это делать:
private Field<int> MyInt;
private Field<int?> MyNullableInt;
private Field<string> MyString;
а затем сможете использовать объекты поля следующим образом:
MyInt = new Field<int>(1); // initialise with a value
MyInt.Value = 2; // assign a new value internally marking it as having a new value
int x = MyInt.Value; // read the current value
int? newInt = MyInt.NewValue; // read the newly set value, or null if there is no new value
Я хочу иметь возможность создавать поля, которые:
- типы значений, такие как int, bool и т. д., которые имеют ограничение NOT NULL в базе данных.
- типы значений, такие как int ?, bool? и т. д., которые допускают NULL в базе данных.
- ссылочные типы, такие как строка, которые всегда допускают значение NULL.
Я все еще изучаю Generics, но я начинаю их понимать, однако я немного зациклился на этом, потому что я могу создать объект Field по мере необходимости выше, который работает с типом, не допускающим значения NULL, или типом, допускающим значение NULL. , но не то и другое одновременно.
Вот что я до сих пор придумал:
protected class Field<T> where T : struct {
private T _Field;
private bool _IsNew;
public Field(T InitialValue) {
_Field = InitialValue;
_IsNew = false;
}
public T Value {
get { return _Field; }
set {
if (!_Field.Equals(value)) {
_Field = value;
_IsNew = true;
}
}
}
public Nullable<T> NewValue {
get {
if (_IsNew) {
_IsNew = false;
return _Field;
}
return null;
}
}
public bool IsNew { get { return _IsNew; } }
}
Это хорошо работает. Я также могу изменить ограничение типа на where T : class
и изменить Nullable<T>
на T
в методе NewValue, что заставляет его работать с типами, допускающими значение NULL, но как мне заставить его работать со всеми типами данных? Мне действительно нужно создавать два разных класса для обработки двух разных сценариев?
Спасибо Бен