C'è un modo per solo bisogno di un oggetto implementare i membri di un'interfaccia senza richiedere esplicitamente implementare in c#?

0

Domanda

Sto facendo un controllo personalizzato simile a un ItemsControl così ha un Items proprietà voglio essere associabile, ma in ordine per il mio controllo per l'aggiornamento, la proprietà deve implementare INotifyCollectionChanged. Vorrei che l'utente sia in grado di associare qualsiasi oggetto così a lungo come si implementa sia INotifyCollectionChanged e IList.

Mentre la soluzione più semplice è creare una nuova interfaccia elenco piace così

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

e richiedono di essere ereditato il loro uso, gli oggetti da collezione.

Tuttavia, invece di fare questo, essi dovrebbero anche essere in grado di utilizzare lo standard ObservableCollection<T> e che non ereditano entrambi INotifyCollectionChanged e IList ma non ereditano INotifyCollectionChangedAndList e non credo di avere il controllo su questo. Allo stesso modo, se si utilizza una libreria diversa con un tipo che non possono controllare che non implementano le due interfacce dovrebbe ancora funzionare.

Quindi la mia domanda è se c'è un modo, semplice o altrimenti (cioè la riflessione) dove posso specificare alcun tipo deve implementare tutti i requisiti di due (o più) interfacce senza l'esplicito SomeClass : INotifyCollectionChangedAndList?

MODIFICA

Credo che la risposta sia no. Così vado a mark @benjamin risposta corretta, perché anche se potrebbe non essere la migliore per il controllo degli autori, in altri casi la cosa più vicina a quello che avrei altrimenti come raggiungere.

1

Migliore risposta

1

Sì, c'è. Non c'è bisogno di riflessione. Basta fare la vostra classe generica e specifica che qualunque sia il tipo di parametro viene passato deve implementare entrambe le interfacce:

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

TModel può essere qualsiasi cosa che implementa le interfacce che si richiedono, così sai sempre che la vostra ItemsControllers avrà un Modello di struttura di tipo TModel che implementa INotifyPropertyChanged e ha anche un Items proprietà di tipo IEnumerable<TItem>.

2021-11-23 01:09:01

La struttura è modo di constrainting il tipo param. Tuttavia non è possibile utilizzare una classe standard XAML a causa di quelle tipo params... Tipo params dovrebbe essere evitato nel controllo / fw elemento classi ecc...
lidqy

Mi ha fatto dimenticare il tipo di vincoli, ma come lidqy menziona i controlli non possono utilizzare farmaci generici facilmente e Microsoft scoraggia nelle loro linee guida. L'utente finale non dovrebbe pasticciare con XAML e generici.
Michael Wagner

In .NET 6.0 alcuni quadri di supporto per controlli generici. Blazor fa, ma non so su WPF. Se non hai il supporto, forse si potrebbe creare un tipo derivato che chiude la generica tipo di base.
benjamin

In altre lingue

Questa pagina è in altre lingue

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