给定以下基类:
public abstract class PurchaseSystemControllerBase<TController, TViewModel> : IInitializable
where TController : PurchaseSystemControllerBase<TController, TViewModel>
where TViewModel : PurchaseSystemViewModelBase<TController, TViewModel> {
protected TViewModel ViewModel { get; private set; }
...
}
public abstract class PurchaseSystemViewModelBase<TController, TViewModel> : ViewModelBase
where TController : PurchaseSystemControllerBase<TController, TViewModel>
where TViewModel : PurchaseSystemViewModelBase<TController, TViewModel> {
protected TController Controller { get; private set; }
...
}
具体实现如下:
public sealed class PurchaseSystemController : PurchaseSystemControllerBase<PurchaseSystemController, PurchaseSystemViewModel> {
...
}
public sealed class PurchaseSystemViewModel : PurchaseSystemViewModelBase<PurchaseSystemController, PurchaseSystemViewModel> {
...
}
有没有一种方法可以简化这一点,以便可以进行以下操作?
public sealed class PurchaseSystemController : PurchaseSystemControllerBase<PurchaseSystemViewModel> {
...
}
public sealed class PurchaseSystemViewModel : PurchaseSystemViewModelBase<PurchaseSystemController> {
...
}
最佳答案
不,不幸的是不是 - 至少,据我所知,不会失去一些类型安全性。 我在 my Protocol Buffers port 中有一个非常相似的设置, 在消息类型和它对应的构建器类型之间。
如果您乐于用一些非泛型基类型声明 ViewModel
和 Controller
属性,那很好 - 但如果您需要知道这两个属性完全对应的类型,你会留下这样的烂摊子。
(请注意,您可能需要考虑 ViewModel 和 Controller 是否应该彼此了解。)
关于c# - 简化 C# 中的循环泛型约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25492753/