Czy istnieje sposób, aby po prostu wymagać, aby obiekt wdrożone elementy interfejsu, nie wymagając, aby wyraźnie podjął go w c#?

0

Pytanie

Tworzę własny element sterowania, podobny ItemsControl tak, że ma Items właściwość, do którego chcę oddać, ale do aktualizacji mojego formantu ta właściwość musi być realizowane INotifyCollectionChanged. Chciałbym, aby użytkownik mógł połączyć dowolny obiekt, jeśli realizuje oba INotifyCollectionChanged i IList.

Podczas gdy proste rozwiązanie polega na tym, aby utworzyć nową listę interfejsów, np.

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

i wymagają, aby on pochodzi od ich własnych obiektów kolekcji.

Jednak zamiast tego, są one również powinny mieć możliwość korzystania standard ObservableCollection<T> także, który dziedziczy zarówno INotifyCollectionChanged i IList ale to nie dziedziczy INotifyCollectionChangedAndList i ja naprawdę nie mogę tego kontrolować. Podobnie, jeśli używają innej biblioteki z typem, który nie może kontrolować, który realizuje dwa interfejsu, nadal musi pracować.

Więc moje pytanie brzmi, czy jest jakiś sposób, prosty lub inny (Czyli Odbicie), gdzie mogę określić, że każdy typ musi implementować wszystkie wymagania dwóch (lub więcej) interfejsów bez wyraźnej SomeClass : INotifyCollectionChangedAndList?

Edytuj

Wierzę, że odpowiedź będzie negatywna. Dlatego nie omieszkam odpowiedź @benjamin jako poprawny, ponieważ, chociaż to może nie być najlepszy dla autorów prac kontrolnych, w innych przypadkach będzie najbliżej do tego, co chciałbym osiągnąć w przeciwnym przypadku.

1

Najlepsza odpowiedź

1

Tak, istnieje. Nie musisz się zastanawiać. Po prostu zrób swoją klasę uniwersalną i określić, że każdy przekazany parametr typu musi implementować zarówno interfejsu:

    public class ItemsController<TModel, TItem> where TModel : INotifyPropertyChanged, IEnumerable<TItem>
    {
        public TModel Model { get; set; }
    }

TModel to może być wszystko, co realizuje oba potrzebne interfejsu, więc zawsze wiesz, co twoje ItemsControllers będzie mieć właściwość modelu typu TModel to realizuje INotifyPropertyChanged a także ma Items właściwość typu IEnumerable<TItem>.

2021-11-23 01:09:01

To jest właściwy sposób ograniczenia parametru typu. Nie można jednak używać taka klasa w standardowym XAML z powodu tych parametrów typu... Należy unikać ustawienia typów w klasach elementów sterowania / fw itp....
lidqy

Naprawdę zapomniałem o ograniczeniach typu, ale, jak wspomina lidqy, elementy sterujące nie mogą łatwo korzystać uniwersalne narzędzia i Microsoft nie zaleca w swoich rekomendacjach. Użytkownikowi nie trzeba męczyć się z XAML i uniwersalne wersjami.
Michael Wagner

W .NET 6.0 niektóre platformy wspierają wspólne elementy sterowania. Блейзор wie, ale ja nie wiem o WPF. Jeśli nie masz wsparcia, być może, można utworzyć pochodnego, który zamyka ogólny typ podstawowy.
benjamin

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................