2010-04-25 5 views
10

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

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

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

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

Tim

ответ

9

Там нет хороших альтернативы.

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

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

Это, как вы могли бы реализовать:

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

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

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

+0

Спасибо за очень инновационное решение. Как вы говорите, он почти работает, но поскольку дополнительные данные не извлекаются из свойств, к которым он был назначен, это означает, что он должен дублироваться в другом месте, что несколько саморазрушительно. Я попытался адаптировать вашу идею для работы с базовыми свойствами зависимостей с помощью метода SetValue(), но SetValue() выполняет проверку типов, которая, кажется, является препятствием для передачи во что угодно, кроме ожидаемого типа. –

0

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

+2

Это будет зависеть от того, требуется ли два равных экземпляра толщины для того же значения в дополнительных данных или нет. – driis

+0

Хм, хороший момент. – AndrewVos

1

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

Смежные вопросы