Existuje způsob, jak jen vyžadují objekt implementovat členy rozhraní, bez nutnosti to explicitně implementovat v c#?

0

Otázka

Dělám vlastní ovládání podobné ItemsControl tak to má Items majetek chci být nimiž lze vytvořit vazbu, ale v pořadí pro moji kontrolu na aktualizace, majetek musí implementovat INotifyCollectionChanged. Rád bych uživateli, aby byl schopen se vázat jakýkoliv objekt, tak dlouho, jak to implementuje INotifyCollectionChanged a IList.

Zatímco jednoduché řešení je vytvořit nové rozhraní seznam tak jako tak

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

a vyžadovat to být dědičné na jejich vlastní kolekce objektů.

Nicméně, namísto toho by měl být také schopen použít standardní ObservableCollection<T> stejně, které má zdědit oba INotifyCollectionChanged a IList ale to není dědit INotifyCollectionChangedAndList a já opravdu nemám nad tím kontrolu. Stejně tak, pokud oni používají různé knihovny s typ, který se nedokáže ovládat, že provede dvě rozhraní mělo by to fungovat.

Takže moje otázka je, jestli existuje způsob, jednoduché nebo jinak (tj. reflexe), kde bych mohl zadat jakýkoliv použitý typ musí implementovat všechny požadavky dvou (nebo více) rozhraní bez výslovného SomeClass : INotifyCollectionChangedAndList?

EDIT

Myslím, že odpověď je ne. Takže označím @benjamin odpověď jako správnou, protože i když to nemusí být to nejlepší pro kontrolu autorů, to bude v jiných případech být nejbližší věc na to, co bych jinak chtěl dosáhnout.

1

Nejlepší odpověď

1

Ano, tam je. Nemusíte odraz. Jen, aby vaše třídy obecné a upřesnit, že bez ohledu na typ parametru je předán, musí implementovat obě rozhraní:

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

TModel může být cokoliv, co implementuje obě rozhraní, budete potřebovat, takže budete vždy vědět, že vaše ItemsControllers bude mít Model vlastnost typ TModel to implementuje INotifyPropertyChanged a také má Items vlastnost typ IEnumerable<TItem>.

2021-11-23 01:09:01

To je propery způsob constrainting typ, param. Však nemůžete použít jako třída ve standardní XAML, protože těch máte typ params... params je třeba se vyhnout v control / fw prvek třídy atd...
lidqy

Zapomněl jsem o typ omezení, ale jako lidqy zmiňuje ovládací prvky nelze použít generické snadno a Microsoft odrazuje to jejich pokyny. Koncový uživatel by neměl mít, aby nepořádek kolem s XAML a generika.
Michael Wagner

V .NET 6.0 některé rámce podpory obecné ovládací prvky. Blazor dělá, ale nevím o WPF. Pokud nemáte podporu, možná byste mohli vytvořit odvozený typ, který uzavírá generic základní typ.
benjamin

V jiných jazycích

Tato stránka je v jiných jazycích

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