Существует ли практическая альтернатива наследованию структуры? (С#)

Я пишу код, который будет заполнять свойства классов Margin, Padding и BorderThickness классов в пространстве имен System.Windows.Documents. Каждое из этих свойств принимает значение в форме System.Windows.Thickness, которое является структурой.

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

Есть ли какой-либо практический способ достичь этого, сохраняя совместимость типов со свойствами, которые я заполняю?

Спасибо за ваши идеи,

Тим

Ответ 1

Нет хороших альтернатив.

В зависимости от того, что вы пытаетесь сделать, вы могли бы определить свой собственный класс с необходимыми свойствами и определить оператор неявного преобразования, чтобы сделать неявное преобразование в правильный тип структуры. Затем вы сможете пройти в своем классе ко всем методам, ожидающим параметр Толщина.

Это противоречит рекомендации использования оператора неявного преобразования, хотя, поскольку он утверждает, что неявное преобразование не должно терять никакой информации. Вы не сможете вернуть толщину из свойства, которое вы читаете, и посмотрите дополнительную информацию, которую вы приложили.

Вот как вы могли его реализовать:

public class ThicknessEx
{
    public string ExtraData { get; set; }
    public Thickness Thickness { get; set; }

    public static implicit operator Thickness(ThicknessEx rhs)
    {
        return rhs.Thickness;
    }
}

Тем не менее, вам, вероятно, лучше, сохранив дополнительные данные в другом месте. Как это сделать будет зависеть от ваших потребностей и приложений.

Ответ 2

Возможно, вы сможете использовать Attached Dependency Properties типа AugmentedThickness, а затем, когда они меняются, обновите базовые свойства, которые они предназначены для Обновить. Для этого требуется, чтобы все доступ выполнялся с использованием ваших прикрепленных свойств, поскольку просто установка свойства Толщина не будет использовать ваш AugmentedThickness. При необходимости вы также можете (хотя это может быть немного злой) прослушать явные изменения свойств Толщины (которые вы не инициировали) и принудительно вернуть их к значению, указанному вашим дополнением.

Ответ 3

Не могли бы вы сохранить словарь, в котором ключ является хеш-кодом структуры?