Există o modalitate de a necesita doar un obiect implementarea membrii de o interfață fără să mai aștepte să-l pună în aplicare în mod explicit în c#?

0

Problema

Eu fac un custom control similar cu un ItemsControl deci are o Items proprietatea vreau să fiu bindable dar, în scopul de control al meu de a actualiza, proprietatea trebuie să pună în aplicare INotifyCollectionChanged. Aș vrea utilizatorul să fie capabil de a lega orice obiect atât timp cât implementează ambele INotifyCollectionChanged și IList.

În timp ce soluția simplă este de a crea o nouă interfață lista ca asa

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

și avea nevoie să-l fi moștenit de la obiceiul lor de obiecte de colecție.

Cu toate acestea, în loc de a face aceasta, ei ar trebui să fie, de asemenea, capabil de a utiliza standard ObservableCollection<T> la fel de bine care nu moștenească ambele INotifyCollectionChanged și IList dar nu moșteni INotifyCollectionChangedAndList și nu pot să controlez asta. De asemenea, dacă ei folosesc o altă bibliotecă cu un tip care nu le pot controla, care nu pune în aplicare cele două interfețe acesta ar trebui să funcționeze în continuare.

Deci, întrebarea mea este dacă există o cale, ușor sau altfel (de exemplu, reflecție) în cazul în care nu pot specifica orice tip utilizate trebuie să pună în aplicare toate cerințele de două (sau mai multe) interfețe fără explicit SomeClass : INotifyCollectionChangedAndList?

EDIT

Cred că răspunsul este nu. Așa că voi marca @benjamin răspundă cât mai corectă pentru că, deși s-ar putea să nu fie cea mai bună pentru controlul autori, acesta va fi, în alte cazuri, să fie cel mai apropiat lucru de ceea ce am, altfel, ar dori să realizeze.

1

Cel mai bun răspuns

1

Da, există. Nu ai nevoie de reflecție. Doar asigurați-vă clasa generică și specifică faptul că, indiferent de tipul de parametru este trecut trebuie să pună în aplicare ambele interfețe:

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

TModel poate fi ceva care implementează ambele interfețe de care aveți nevoie, astfel încât să știi întotdeauna că ItemsControllers va avea un Model de proprietate de tip TModel care implementează INotifyPropertyChanged și, de asemenea, are o Items proprietate de tip IEnumerable<TItem>.

2021-11-23 01:09:01

Asta e propery mod de constrainting tip param. Cu toate acestea, nu puteți folosi o astfel de clasă în standard XAML din cauza celor de tip params... Tip params ar trebui să fie evitate în control / fw element clase etc...
lidqy

Am uitat despre tipul de constrângeri, dar, ca lidqy menționează controale pot folosi medicamente generice cu ușurință și Microsoft descurajează în orientările lor. Utilizatorul final nu trebuie să mizerie în jurul cu XAML și generice.
Michael Wagner

În .NET 6.0 unele cadre de sprijin generic controale. Blazor face, dar nu știu despre WPF. Dacă nu ai sprijin, poate ai putea crea un tip derivat, care se închide generic tipul de bază.
benjamin

În alte limbi

Această pagină este în alte limbi

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