泛型过载模糊

时间:2012-10-16 20:50:02

标签: c# generics overloading

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

但是我想更多地理解模糊性(看看我是否可以保持重载!)

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

我开始在两个没有继承关系的视图模型上使用这些帮助器,并且它们工作正常。

然后我决定另一个对于ViewModelWrapper的另一个oveload很有用,它是其他视图模型类型的基类。所以编译器抱怨说它不知道用于VmWrapper以前工作的子类的扩展名。

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

有谁看到我如何保持这些作为重载工作?

干杯,
Berryl

// 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) { ... }

1 个答案:

答案 0 :(得分: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