c# - 如何在泛型参数中指定类和接口(interface)?

标签 c# generics

我有一个类需要布局 View实现 INavigationWrapper 的.如果我这样定义它:

public class NavigationStackLayout : Layout<T> where T : View, INavigationWrapper

然后我需要在其他地方指定 T。如果我这样定义它:

public class NavigationStackLayout : Layout<View>

public class NavigationStackLayout : Layout<INavigationWrapper>

然后类(class)的 children 缺少了他们类型的一部分。如果我这样定义它:

public class NavigationStackLayout : Layout<View : INavigationWrapper>

那么这是一个语法错误。如何在泛型参数中指定类和接口(interface),而不需要指定特定的子类?

更新:

明确一点,我不拥有 Layout<T> ,所以我不能只向我的非泛型类添加泛型方法;我需要使用 Layout<T>的现有方法。我知道它们会起作用,因为 Layout<T> 上的约束是where T : View .

我正在寻找一种解决方案,它可以完成以下工作:

class View1 : View, INavigationWrapper {}
class View2 : ContentView, INavigationWrapper {} // ContentView is a subclass of View
class View3 : View

var stack = new NavigationStackLayout();
stack.Add(new View1()); // this works
stack.Add(new View2()); // this also works
stack.Add(new View3()); // this fails at compile time

最佳答案

假设您可以只将一个类放入每个 NavigationStackLayout 对象中,您可以走通用路线并在单独的非通用类上添加一个静态方法,以通用方式创建一个实例并允许您避免必须命名通用参数。

或者选择一个具体的类,因为过于通用的代码不值得那么麻烦。

作为最后一个选项,您可以将所有函数重新实现为通用的并限制类型,只需为您的底层存储选择一种类型或另一种类型,并在取出时转换它。

根本的问题是你需要一个类型来填充泛型参数。您需要下注并要求其他人做出选择(通用)或选择存在的单一类型(因此 ViewINavigationWrapper)。

请注意,如果您希望以下类型共存于一个布局中,无论您做什么,您都将稍微改变类型安全规则(例如选择任意基类进行存储)。

class View1 : View, INavigationWrapper
class View2 : View, INavigationWrapper

关于c# - 如何在泛型参数中指定类和接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39266600/

相关文章:

c# - 在用户操作时显示/隐藏列表框项目

c# - HTTP/2 与 ASP.NET Core 2.2

java - 为什么编译器不强制扩展接口(interface)的泛型的返回类型值?

c# - 如何在 Orchard 的特殊区域中为特殊小部件创建 View 替代?

c# - ObservableCollection 以及存储库

c# - 如何转换实现接口(interface)的具体类的列表

c# - 返回通用接口(interface)的工厂类

ios - 协议(protocol)关联类型和泛型

c# - 将 C# 中的调试器附加到另一个进程

generics - Swift - 闭包中的泛型