Existuje spôsob, ako vyžadujú iba objekt realizovať členov rozhranie bez toho, aby to výslovne ho v c#?

0

Otázka

Som robiť vlastné ovládanie podobne ItemsControl tak to má Items majetku chcem byť bindable, ale aby moje kontroly aktualizovať, majetku sa musí realizovať INotifyCollectionChanged. Rád by som sa užívateľovi byť schopný viazať žiadne objekt tak dlho, ako to realizuje oboch INotifyCollectionChanged a IList.

Zatiaľ čo jednoduché riešenie je vytvoriť nové rozhranie zoznam tak ako

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

a to vyžadujú sa dedia na ich vlastných zbierkových predmetov.

Avšak, namiesto robiť to, že by mali byť tiež schopní použiť štandardné ObservableCollection<T> ako dobre, ktoré sa dedia oboch INotifyCollectionChanged a IList ale to nie zdediť INotifyCollectionChangedAndList a nemám naozaj mať kontrolu nad to. Podobne ak používajú inú knižnicu s typom, ktoré nemôžu kontrolovať, aby sa zrealizujú dve rozhrania by to malo fungovať aj naďalej.

Takže moja otázka je, či existuje spôsob, jednoduché alebo inak (t.j. odraz), kde by som mohol určiť všetky typy používané musí realizovať všetky požiadavky z dvoch (alebo viac) rozhrania bez výslovného SomeClass : INotifyCollectionChangedAndList?

UPRAVIŤ

Verím, že odpoveď je nie. Takže som chcel marek @benjamin odpoveď za správnu, pretože aj keď to nemusí byť najlepšie pre kontrolu autorov, bude to v iných prípadoch sa najbližší vec, čo by som inak chceli dosiahnuť.

1

Najlepšiu odpoveď

1

Áno, existuje. Nemusíte reflexie. Stačí, aby vaša trieda všeobecné a určiť, že bez ohľadu na typ parameter je úspešný, musí implementovať obe rozhrania:

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

TModel môže byť čokoľvek, ktorá implementuje oboch rozhraní, ktorú potrebujete, takže vždy budete vedieť, že vaše ItemsControllers bude mať Modelu vlastnosť typ TModel ktorá implementuje INotifyPropertyChanged a tiež má Items vlastníctvo typu IEnumerable<TItem>.

2021-11-23 01:09:01

To je propery spôsob constrainting typ param. Avšak nie je možné použiť ako triedy v štandardných XAML, pretože tie typ params... Typ params sa treba vyhnúť v control / fw prvok triedy atď...
lidqy

Som zabudnúť typ obmedzení, ale ako lidqy spomína ovládacie prvky sa nemôžu používať generické lieky ľahko a Microsoft odrádza, že v ich pravidlá. Koncový užívateľ by nemal mať na neporiadok okolo s XAML a generiká.
Michael Wagner

V .NET 6.0 niektoré rámce podpory generických kontroly. Blazor sa, ale neviem o WPF. Ak nemáte podporu, možno by ste mohli vytvoriť odvodené typ, ktorý zatvorí všeobecný základný typ.
benjamin

V iných jazykoch

Táto stránka je v iných jazykoch

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