有没有办法只是需要一个对象执行的成员一个接口不需要它明确地实现它在c#?

0

的问题

我想提出一个自定义控制类似于一个 ItemsControl 因此它具有一个 Items 酒店我想要是可绑定的,但是为了我的控制,以更新,财产必须实现 INotifyCollectionChanged. 我想用户能够结合的任何对象,只要它实现了两个 INotifyCollectionChangedIList.

而简单的解决办法是创建一个新的界面列表中,像这样

public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

并要求它能继承他们的定义收集的对象。

但是,不这样做,他们也应该能够使用的标准 ObservableCollection<T> 以及它会继承这两种 INotifyCollectionChangedIList 但它并 不是 继承的 INotifyCollectionChangedAndList 我真的没有控制。 同样,如果他们使用不同的图书馆与一个类型,他们不能控制,并实现两个接口,它仍应工作。

所以我的问题是如果有一个方法,简单或否则(即反映),在那里我可以指定任何类型的使用必须实现所有要求的两个(或更多)的接口不明确 SomeClass : INotifyCollectionChangedAndList?

编辑

我认为答案是 . 所以我要去标记@本杰明的回答,因为正确的,因为尽管它可能不是最好的控制提交人,它将在其他情况下是最近的事什么我会来实现。

1

最好的答案

1

是的,是有的。 你不需要反思。 只是让你流的通用指定任何类型参数通过了必须实现两者的界面:

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

TModel 可以是任何实现两者的接口,你需要的,所以你总是知道你的 ItemsController会有一个模型酒店的类型 TModel 实现 INotifyPropertyChanged 还有一个 Items 酒店的类型 IEnumerable<TItem>.

2021-11-23 01:09:01

这是酒店的方式constrainting类型参数。 但是你不能使用这类标准的XAML因为这些类型params...类型的参数应当避免在控制/f件类别等等...
lidqy

我没有忘记种类型的制约,但是,像lidqy提到的控制,不能容易地使用泛型和微软阻碍了它们的指导原则。 终端用户不应该乱馈仿制药。
Michael Wagner

中。净6.0一些框架,支持一般的控制。 Blazor做,但我不知道WPF. 如果你不支持,也许你可以创建一个源类型,关闭通用基类型。
benjamin

其他语言

此页面有其他语言版本

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