Bir nesnenin bir arabirimin üyelerini c# ' da açıkça uygulamasına gerek kalmadan uygulamasını gerektirmenin bir yolu var mı?

0

Soru

Benzer bir özel denetim yapıyorum ItemsControl yani bir var Items özelliğine bağlanabilir olmasını istiyorum ama güncelleme için kontrol benim için özelliği uygulamalıdır INotifyCollectionChanged. Kullanıcının her ikisini de uyguladığı sürece herhangi bir nesneyi bağlayabilmesini istiyorum INotifyCollectionChanged ve IList.

Basit çözüm, bunun gibi yeni bir arayüz listesi oluşturmaktır

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

ve özel koleksiyon nesnelerinde devralınmasını gerektirir.

Bununla birlikte, bunu yapmak yerine standardı da kullanabilmelidirler ObservableCollection<T> her ikisini de miras alan şey INotifyCollectionChanged ve IList ama miras almaz. INotifyCollectionChangedAndList ve bunun üzerinde gerçekten kontrolüm yok. Aynı şekilde, iki arabirimi uygulayan kontrol edemedikleri bir türe sahip farklı bir kitaplık kullanırlarsa, yine de çalışması gerekir.

Bu yüzden sorum şu ki, kullanılan herhangi bir türü belirtebileceğim bir yol, kolay veya başka bir şekilde (yani yansıma), iki (veya daha fazla) arabirimin tüm gereksinimlerini açık olmadan uygulamalıdır SomeClass : INotifyCollectionChangedAndList?

düzenlemek

Cevabın hayır olduğuna inanıyorum. Bu yüzden @ benjamin'in cevabını doğru olarak işaretleyeceğim çünkü kontrol yazarları için en iyisi olmasa da, diğer durumlarda başka türlü elde etmek istediğim şeye en yakın şey olacak.

1

En iyi cevabı

1

Evet, var. Yansımaya ihtiyacın yok. Sınıfınızı genel hale getirin ve geçirilen tür parametresinin her iki arabirimi de uygulaması gerektiğini belirtin:

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

TModel ihtiyacınız olan her iki arabirimi de uygulayan herhangi bir şey olabilir, böylece her zaman ItemsControllers türünde bir Model özelliğine sahip olacak TModel bu uygular INotifyPropertyChanged ve aynı zamanda bir var Items türün özelliği IEnumerable<TItem>.

2021-11-23 01:09:01

Bu, tür parametresini kısıtlamanın uygun yoludur. Ancak, bu tür paramlar nedeniyle standart xaml'de böyle bir sınıfı kullanamazsınız... Denetim / fw öğe sınıflarında vb. Tür parametrelerinden kaçınılmalıdır...
lidqy

Tür kısıtlamalarını unuttum, ancak lidqy'nin belirttiği gibi kontroller jenerikleri kolayca kullanamaz ve Microsoft bunu yönergelerinde cesaretlendirir. Son kullanıcının XAML ve jeneriklerle uğraşması gerekmemelidir.
Michael Wagner

. NET 6.0'da bazı çerçeveler genel denetimleri destekler. Blazor biliyor ama wpf'yi bilmiyorum. Desteğiniz yoksa, genel temel türü kapatan türetilmiş bir tür oluşturabilirsiniz.
benjamin

Diğer dillerde

Bu sayfa diğer dillerde

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