Версия Tomtom представляет собой попытку использовать словарь вместо полей; это гибкий - вроде как ExpandoObject
- но он может быть удивительно неэффективным, включая множество дополнительных объектов (словарь, ключи, плюс независимо от того, какие древовидные структуры использует словарь) и много циклов ЦП потратили на поиск постоянно .
Если у вас есть много потенциальных полей (и по лотам я имею в виду, как в сотнях), но вы обычно используете только 3 одновременно, тогда это может быть эффективным решением. Аналогично, если структура полностью динамическая (возможно, на основе входных данных, которые вы не контролируете, предположительно в сочетании с ICustomTypeDescriptor
), то это может быть полезно. Сочетание словаря и CallerMemberName
предполагает, что является , предназначенным для использования со свойствами, что делает это ... очень странным.
Но в целом: я бы использовал более простую версию ref
field. Причина, по которой у этого метода нет Get
, заключается в том, что вызывающий абонент может уже просто использовать поле напрямую.
Итак: если вы хотите такой код, я бы использовал:
public class MyType : BaseModel
{
private string _name;
public string Name {
get => _name;
set => SetProperty(ref _name, value);
}
private int _id;
public string Id {
get => _id;
set => SetProperty(ref _id, value);
}
}
Я предполагаю, что версия Tomtom пытается избежать объявления полей, т. Е.
public class MyType : BaseModel
{
public string Name {
get => GetProperty<string>();
set => SetProperty<string>(value);
}
public string Id {
get => Get<int>();
set => SetProperty<int>(value);
}
}
Но ... да, не делай этого. В дополнение ко всему остальному это приводит к тому, что все типы значений будут упакованы. Поля в порядке ...