有没有办法只要求对象实现接口的成员而不要求它在 C# 中显式实现它?

Is there a way to just require an object implement the members of an interface without requiring it to explicitly implement it in c#?

我正在制作一个类似于 ItemsControl 的自定义控件,所以它有一个 Items 属性 我想绑定到但为了让我的控件更新,属性 必须实施 INotifyCollectionChanged。我希望用户能够绑定任何对象,只要它实现了 INotifyCollectionChangedIList.

虽然简单的解决方案是像这样创建一个新的接口列表

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

并要求在他们的自定义集合对象上继承它。

但是,除了这样做之外,他们还应该能够使用标准 ObservableCollection<T>,它继承了 INotifyCollectionChangedIList,但确实继承了 not inherit INotifyCollectionChangedAndList 我真的无法控制它。同样,如果他们使用不同的库,其类型是他们无法控制的,但确实实现了这两个接口,它应该仍然可以工作。

所以我的问题是,是否有一种方法,简单或其他方式(即反射),我可以指定使用的任何类型必须实现两个(或更多)接口的所有要求,而无需显式 SomeClass : INotifyCollectionChangedAndList

编辑

我认为答案是。所以我要将@benjamin 的答案标记为正确,因为虽然它可能不是控件作者的最佳选择,但在其他情况下它会是最接近我想要实现的目标。

是的,有。你不需要反省。只需使您的 class 通用并指定传递的任何类型参数都必须实现两个接口:

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

TModel 可以是任何实现你需要的接口的东西,所以你总是知道你的 ItemsControllers 将有一个类型 TModel 的模型 属性实现 INotifyPropertyChanged 并且还有一个 Items 属性 类型 IEnumerable<TItem>.