2010-04-25 11 views
10

Piszę kod, który zapełni właściwości klas Margin, Padding i BorderThickness w przestrzeni nazw System.Windows.Documents. Każda z tych właściwości przyjmuje wartość w postaci System.Windows.Thickness, która jest strukturą.Czy istnieje praktyczna alternatywa dla dziedziczenia struct? (C#)

Jednak chcę powiązać dodatkowe dane z każdym z tych przydziałów nieruchomości, które następnie mogą być odzyskane przez mój kod. Jeśli Thickness byłaby klasą, dziedziczę z niej i zdefiniuję właściwości w podklasie, aby przechowywać moje dodatkowe elementy danych. Ale ponieważ jest to struktura, dziedziczenie nie jest możliwe.

Czy jest jakiś praktyczny sposób, aby to osiągnąć, zachowując zgodność typu z właściwościami, które zapełniam?

Dzięki za pomysły,

Tim

Odpowiedz

9

Brak dobre alternatywy.

W zależności od tego, co próbujesz zrobić, możesz prawdopodobnie zdefiniować własną klasę z właściwościami, których potrzebujesz, i zdefiniować niejawny operator konwersji, aby wykonać niejawną konwersję na właściwy typ struktury. Wtedy byłbyś w stanie przekazać swoją klasę wszystkim metodom oczekującym parametru Grubość.

Byłoby to sprzeczne z zaleceniem używania niejawnego operatora konwersji, ponieważ stwierdza, że ​​niejawna konwersja nie powinna tracić żadnych informacji. Nie będziesz w stanie odzyskać Grubości z nieruchomości, którą czytasz, i zobaczyć dodatkowe informacje, które dołączyłeś.

ten sposób można go realizować:

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

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

Jednak, jesteś prawdopodobnie lepiej poprzez przechowywanie dodatkowych danych gdzie indziej. Jak to zrobić, zależy od Twoich potrzeb i zastosowania.

+0

Dzięki za bardzo innowacyjne rozwiązanie. Jak sam mówisz, prawie działa, ale ponieważ dodatkowe dane nie są dostępne z właściwości, do których został przypisany, oznacza to, że musi on zostać skopiowany w innym miejscu, co jest nieco samoobronne. Próbowałem zaadaptować twój pomysł do pracy z zależnymi właściwościami zależności za pomocą metody SetValue(), ale funkcja SetValue() wykonuje sprawdzanie typu, co wydaje się być przeszkodą w przekazywaniu niczego oprócz oczekiwanego typu. –

0

Nie możesz zapisać słownika, gdzie klucz jest hash kodu struktury?

+2

To zależy od tego, czy dwie równe instancje grubości muszą mieć tę samą wartość w dodatkowych danych, czy nie. – driis

+0

Hmm, dobry punkt. – AndrewVos

1

Być może będziesz w stanie użyć Attached Dependency Properties typu AugmentedThickness, a następnie, po zmianie, zaktualizować właściwości, które mają zostać zaktualizowane. Wymaga to wykonania całego dostępu za pomocą załączonych właściwości, ponieważ ustawienie właściwości Grubość nie spowoduje użycia AugmentedThickness. Jeśli to konieczne, możesz również (choć może to być trochę złe) posłuchaj wyraźnych zmian właściwości Grubości (których nie zainicjowałeś) i zmuś go z powrotem do wartości określonej przez AugmentedThickness.

Powiązane problemy