1

在阅读了Skeet 的文章后,我接受了一般建议:“..考虑重命名一些方法以减少重载程度。当它跨越继承层次结构时,这个建议会加倍......”

但我想更多地理解歧义(看看我是否可以保持过载!)

这些只是一些测试助手,用于帮助排除繁琐测试的一部分,这些测试可能需要各种风格的视图模型首先处于某种有效或无效状态。

我开始在两个没有继承关系的视图模型上使用这些助手,它们工作得很好。

然后我决定另一个对 ViewModelWrapper 的另一个超载有用,它是其他视图模型类型的基类。所以编译器抱怨它不知道要为以前工作的 VmWrapper 子类使用哪个扩展。

在这种情况下,这是下面代码中的第 3 次重载和第 1 次重载。就像我暗示的那样,我已经消除了重载,但是

有谁知道我如何让这些工作作为重载工作?

干杯,
贝里尔

// SatVm
public static void MakeValid<TParentModel, TModel>(this ISatelliteVm<TParentModel, TModel> instance, IEntityValidator validator) {...}

// HubVm
public static void MakeValid<TParentModel>(this HubViewModel<TParentModel> instance, IEntityValidator validator, bool bValid = true)
where TParentModel : Entity {   ... }

// VmWrapper    
public static void MakeValid<TModel>(this ViewModelWrapper<TModel> instance, IEntityValidator validator) { ... }
4

1 回答 1

2

您可以简单地按 vm 类型为每组扩展使用单独的命名空间。

namespace Extensions.Satellite
{
    // SatVm
    public static void MakeValid<TParentModel, TModel>(this ISatelliteVm<TParentModel, TModel> instance, IEntityValidator validator) {...}
}

namespace Extensions.Hub
{
    // HubVm
    public static void MakeValid<TParentModel>(this HubViewModel<TParentModel> instance, IEntityValidator validator, bool bValid = true)
        where TParentModel : Entity {   ... }
}

namespace Extensions.Wrapper
{
    // VmWrapper    
    public static void MakeValid<TModel>(this ViewModelWrapper<TModel> instance, IEntityValidator validator) { ... }
}

然后只需使用正确的命名空间。

在相关新闻中,您可能需要查看:Overriding Extension Methods

于 2012-10-16T21:06:08.090 回答