如何在泛型参数中指定类和接口?

时间:2016-09-01 08:37:04

标签: c# generics

我有一个课程需要列出实现View的{​​{1}}。如果我这样定义:

INavigationWrapper

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

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

public class NavigationStackLayout : Layout<View>
然后是班级&#39;孩子们缺少他们类型的一部分。如果我这样定义:

public class NavigationStackLayout : Layout<INavigationWrapper>

然后这是一个语法错误。如何在泛型参数中指定类和接口,而无需指定特定的子类?

更新:

要明确,我不拥有public class NavigationStackLayout : Layout<View : INavigationWrapper> ,所以我不能只将泛型方法添加到我的非泛型类中;我需要使用Layout<T>的现有方法。我知道他们会工作,因为Layout<T>上的约束是Layout<T>

我正在寻找能够完成以下工作的解决方案:

where T : View

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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