Есть ли способ просто потребовать, чтобы объект реализовывал элементы интерфейса, не требуя, чтобы он явно реализовывал его в c#?

0

Вопрос

Я создаю пользовательский элемент управления, аналогичный ItemsControl так что у него есть Items свойство, к которому я хочу привязаться, но для обновления моего элемента управления это свойство должно быть реализовано INotifyCollectionChanged. Я бы хотел, чтобы пользователь мог привязать любой объект, если он реализует оба INotifyCollectionChanged и IList.

В то время как простое решение состоит в том, чтобы создать новый список интерфейсов, например

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

и требуют, чтобы он наследовался от их пользовательских объектов коллекции.

Однако вместо этого они также должны иметь возможность использовать стандарт ObservableCollection<T> также, который наследует оба INotifyCollectionChanged и IList но это не наследует INotifyCollectionChangedAndList и я действительно не могу это контролировать. Аналогично, если они используют другую библиотеку с типом, который они не могут контролировать, который реализует два интерфейса, он все равно должен работать.

Поэтому мой вопрос в том, есть ли способ, простой или иной (т. Е. Отражение), где я могу указать, что любой используемый тип должен реализовывать все требования двух (или более) интерфейсов без явного SomeClass : INotifyCollectionChangedAndList?

Редактировать

Я верю, что ответ будет отрицательным. Поэтому я отмечу ответ @benjamin как правильный, потому что, хотя он может быть не лучшим для авторов контрольных работ, в других случаях он будет ближе всего к тому, чего я хотел бы достичь в противном случае.

1

Лучший ответ

1

Да, есть. Тебе не нужно размышлять. Просто сделайте свой класс универсальным и укажите, что любой передаваемый параметр типа должен реализовывать оба интерфейса:

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

TModel это может быть все, что реализует оба необходимых вам интерфейса, поэтому вы всегда знаете, что ваш ItemsControllers будет иметь свойство модели типа TModel это реализует INotifyPropertyChanged а также имеет Items свойство типа IEnumerable<TItem>.

2021-11-23 01:09:01

Это правильный способ ограничения параметра типа. Однако вы не можете использовать такой класс в стандартном XAML из-за этих параметров типа... Следует избегать параметров типов в классах элементов управления / fw и т. Д....
lidqy

Я действительно забыл об ограничениях типа, но, как упоминает lidqy, элементы управления не могут легко использовать универсальные средства, и Microsoft не рекомендует это в своих рекомендациях. Конечному пользователю не нужно возиться с XAML и универсальными версиями.
Michael Wagner

В .NET 6.0 некоторые платформы поддерживают общие элементы управления. Блейзор знает, но я не знаю о WPF. Если у вас нет поддержки, возможно, вы могли бы создать производный тип, который закрывает общий базовый тип.
benjamin

На других языках

Эта страница на других языках

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