有没有办法只要求对象实现接口的成员而不要求它在 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
。我希望用户能够绑定任何对象,只要它实现了 INotifyCollectionChanged
和 IList
.
虽然简单的解决方案是像这样创建一个新的接口列表
public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }
并要求在他们的自定义集合对象上继承它。
但是,除了这样做之外,他们还应该能够使用标准 ObservableCollection<T>
,它继承了 INotifyCollectionChanged
和 IList
,但确实继承了 not inherit INotifyCollectionChangedAndList
我真的无法控制它。同样,如果他们使用不同的库,其类型是他们无法控制的,但确实实现了这两个接口,它应该仍然可以工作。
所以我的问题是,是否有一种方法,简单或其他方式(即反射),我可以指定使用的任何类型必须实现两个(或更多)接口的所有要求,而无需显式 SomeClass : INotifyCollectionChangedAndList
?
编辑
我认为答案是否。所以我要将@benjamin 的答案标记为正确,因为虽然它可能不是控件作者的最佳选择,但在其他情况下它会是最接近我想要实现的目标。
是的,有。你不需要反省。只需使您的 class 通用并指定传递的任何类型参数都必须实现两个接口:
public class ItemsController<TModel, TItem> where TModel : INotifyPropertyChanged, IEnumerable<TItem>
{
public TModel Model { get; set; }
}
TModel
可以是任何实现你需要的接口的东西,所以你总是知道你的 ItemsController
s 将有一个类型 TModel
的模型 属性实现 INotifyPropertyChanged
并且还有一个 Items
属性 类型 IEnumerable<TItem>
.
我正在制作一个类似于 ItemsControl
的自定义控件,所以它有一个 Items
属性 我想绑定到但为了让我的控件更新,属性 必须实施 INotifyCollectionChanged
。我希望用户能够绑定任何对象,只要它实现了 INotifyCollectionChanged
和 IList
.
虽然简单的解决方案是像这样创建一个新的接口列表
public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }
并要求在他们的自定义集合对象上继承它。
但是,除了这样做之外,他们还应该能够使用标准 ObservableCollection<T>
,它继承了 INotifyCollectionChanged
和 IList
,但确实继承了 not inherit INotifyCollectionChangedAndList
我真的无法控制它。同样,如果他们使用不同的库,其类型是他们无法控制的,但确实实现了这两个接口,它应该仍然可以工作。
所以我的问题是,是否有一种方法,简单或其他方式(即反射),我可以指定使用的任何类型必须实现两个(或更多)接口的所有要求,而无需显式 SomeClass : INotifyCollectionChangedAndList
?
编辑
我认为答案是否。所以我要将@benjamin 的答案标记为正确,因为虽然它可能不是控件作者的最佳选择,但在其他情况下它会是最接近我想要实现的目标。
是的,有。你不需要反省。只需使您的 class 通用并指定传递的任何类型参数都必须实现两个接口:
public class ItemsController<TModel, TItem> where TModel : INotifyPropertyChanged, IEnumerable<TItem>
{
public TModel Model { get; set; }
}
TModel
可以是任何实现你需要的接口的东西,所以你总是知道你的 ItemsController
s 将有一个类型 TModel
的模型 属性实现 INotifyPropertyChanged
并且还有一个 Items
属性 类型 IEnumerable<TItem>
.