Existe uma maneira de apenas necessitam de um objeto que implemente os membros de uma interface sem exigir que ele explicitamente implementar em c#?

0

Pergunta

Eu estou fazendo um controle personalizado é semelhante a um ItemsControl então, ele tem uma Items propriedade quero ser ligáveis, mas para o meu controle para atualização, a propriedade deve implementar INotifyCollectionChanged. Eu gostaria de o usuário ser capaz de vincular de qualquer objeto desde que implementa INotifyCollectionChanged e IList.

Enquanto a solução simples é criar uma nova lista de interface, como por

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

e exigem ser herdada em seu costume objetos de coleção.

No entanto, em vez de fazer isso, eles também devem ser capazes de utilizar o padrão de ObservableCollection<T> bem que herdar tanto INotifyCollectionChanged e IList mas não herdam INotifyCollectionChangedAndList e eu realmente não tenho controle sobre isso. Da mesma forma, se usar uma biblioteca diferente com um tipo que eles não podem controle que implementa duas interfaces de ele ainda deve funcionar.

Então a minha pergunta é se existe uma maneira fácil ou caso contrário (i.e. reflexão), onde pode especificar qualquer tipo utilizado deve implementar todos os requisitos de duas (ou mais) interfaces sem a explícita SomeClass : INotifyCollectionChangedAndList?

EDITAR

Creio que a resposta é não. Então, eu vou marcar @benjamin resposta como correta, porque embora possa não ser o melhor para os autores de controle, em outros casos, pode ser a coisa mais próxima que eu poderia alcançar.

1

Melhor resposta

1

Sim, há. Você não precisa de reflexão. Apenas faça a sua classe genérica e especificar que qualquer que seja o tipo de parâmetro é passado deve implementar ambas as interfaces:

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

TModel pode ser qualquer coisa que implementa as interfaces que exigem, assim você sempre sabe o que o seu ItemsControllera vontade de ter um Modelo de propriedade de tipo de TModel que implementa INotifyPropertyChanged e também tem um Items propriedade do tipo IEnumerable<TItem>.

2021-11-23 01:09:01

Essa é a propriedade a forma de constrainting o tipo param. No entanto, você não pode usar essa classe padrão XAML por causa do tipo de parâmetros... Tipo params deve ser evitado no controle / fw elemento de classes etc...
lidqy

Eu fiz esquecer tipo de restrições, mas, como lidqy menciona controles não pode usar generics facilmente e Microsoft desencoraja-lo em suas diretrizes. O usuário final não tem que mexer com o XAML e genéricos.
Michael Wagner

Em .NET 6.0 algumas estruturas de apoio controles genéricos. Blazor faz, mas eu não sei sobre o WPF. Se você não tem apoio, talvez você poderia criar um tipo derivado que fecha o genérico do tipo de base.
benjamin

Em outros idiomas

Esta página está em outros idiomas

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