使用接口与使用此接口管理对象的通用类型 class 进行通信

Using an interface to communicate back to a Generic Type class that manages objects with this interface

我有一个泛型 class 叫做

public class ScrollClippingViewer<T> where T : Control, IFScrollClippingItem

此 class 将处理同样继承 IFScrollClippingItem 的不同类型的用户控件。它会将 UserControl 存储在一个列表中,并确保它们在 ScrollViewer 中按顺序显示。

我想要的是 UserControl 在界面中有一个 属性 或方法,可以创建与 ScrollClippingViewer 通信的可能性;我的问题出现了,因为 ScrollClippingViewer 是一个通用类型 class,我不知道如何把它放在界面中:

public interface IFScrollClippingItem
{
        // This does not work
        ScrollClippingViewer<T> refScrollClippingViewer { get; set; }

        // This neither
        void SetScrollClippingViewer(ScrollClippingViewer<T> argRefScrollClippingViewer);
}

您可以在界面中使用模板化方法,如下所示:

public interface IFScrollClippingItem
{
  void SetScrollClippingViewer<T>(ScrollClippingViewer<T> argRefScrollClippingViewer) where T: Control, IFScrollClippingItem;
}

但这似乎不是个好主意,因为模板类型T与接口没有联系,所以在实现接口时你会这样写:

public class SampleControl: Control, IFScrollClippingItem
{
  public void SetScrollClippingViewer<T>(ScrollClippingViewer<T> argRefScrollClippingViewer) where T: Control, IFScrollClippingItem
  {
    ...
  }
}

在此方法中,您将能够使用已传递的 argRefScrollClippingViewer,但您将无法将其保存到键入的 属性,只要不能属性 类型 ScrollClippingViewer<T>

我建议你引入一些接口:IScrollClippingViewer,它将由 ScrollClippingViewer 实现,并将为 IFScrollClippingItem 个实例提供所需的功能。

例如:

public interface IScrollClippingViewer 
{
   ...
}

public class ScrollClippingViewer<T>: IScrollClippingViewer where T: Control, IFScrollClippingItem
{ 
   ...
}

public interface IFScrollClippingItem 
{
   IScrollClippingViewer Viewer { get; set; }
}