Est-il un moyen pour juste besoin d'un objet de mettre en œuvre les membres d'une interface sans l'exiger explicitement à mettre en œuvre en c#?

0

La question

Je fais un contrôle personnalisé similaire à un ItemsControl ainsi, il a une Items bien, je veux être bindable, mais dans l'ordre à mon contrôle pour la mise à jour, la propriété doit mettre en œuvre INotifyCollectionChanged. J'aimerais que l'utilisateur soit en mesure de lier n'importe quel objet en tant qu'il met en œuvre à la fois INotifyCollectionChanged et IList.

Alors que la solution la plus simple est de créer une nouvelle liste d'interface comme

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

et exiger que ce soit hérité de leurs personnalisé des objets de collection.

Cependant, au lieu de faire cela, ils doivent également être en mesure d'utiliser la norme ObservableCollection<T> ainsi ce qui n'héritent à la fois INotifyCollectionChanged et IList mais il n'est pas hériter INotifyCollectionChangedAndList et je n'ai pas vraiment le contrôle. De même, si l'utilisation d'une bibliothèque avec un type qu'il ne peut pas contrôler qui n'en œuvre les deux interfaces, il doit encore travailler.

Donc ma question est si il y a un moyen, facile ou le contraire (c'est à dire la réflexion), où j'pouvez spécifier n'importe quel type utilisé doit mettre en œuvre toutes les exigences de deux (ou plus) des interfaces sans l'explicite SomeClass : INotifyCollectionChangedAndList?

MODIFIER

Je crois que la réponse est non. Donc, je vais marquer @benjamin réponse comme correcte, parce que bien qu'il pourrait ne pas être le meilleur pour contrôler des auteurs, il sera dans d'autres cas, être la chose la plus proche de ce que j'aimerais atteindre.

1

La meilleure réponse

1

Oui, il est. Vous n'avez pas besoin de réflexion. Faites votre classe générique et de préciser que quel que soit le type de paramètre est transmis doit implémenter deux interfaces:

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

TModel peut être quelque chose qui implémente deux interfaces dont vous avez besoin, de sorte que vous savez toujours que votre ItemsControllers auront un Modèle de propriété de type TModel qui met en œuvre INotifyPropertyChanged et dispose également d'un Items propriété de type IEnumerable<TItem>.

2021-11-23 01:09:01

C'est le propery façon de constrainting le type de param. Cependant, vous ne pouvez pas utiliser cette classe dans la norme XAML à cause de ceux de type params... Type params devrait être évitée, contrôle / fw élément de classes, etc...
lidqy

Je n'ai oublier les contraintes de type, mais comme lidqy mentionne commandes ne peuvent pas utiliser des génériques facilement et Microsoft déconseille dans leurs lignes directrices. L'utilisateur final ne devrait pas avoir à déranger avec XAML et les génériques.
Michael Wagner

Dans .NET 6.0 certains cadres de soutien génériques. Blazor fait, mais je ne sais pas à propos de WPF. Si vous n'avez pas le support, vous pourriez peut-être créer un type dérivé qui ferme le générique de type de base.
benjamin

Dans d'autres langues

Cette page est dans d'autres langues

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