仅基于返回类型重载

时间:2009-09-02 06:38:23

标签: c# overloading

我有一种情况我想要返回List<>从这个功能

public DataTable GetSubCategoriesBySubCatID(Guid SubCategoryID)

所以我想要的是

public List<SubCategories> GetSubCategoriesBySubCatID(Guid SubCategoryID)

我知道仅基于返回类型不支持重载,我只是不想在两个函数中复制相同的代码。

实现这一目标的最佳方式是什么,而不会影响第一个功能

的引用

4 个答案:

答案 0 :(得分:5)

给他们不同的名字:

public DataTable GetSubCategoryTableBySubCatID(Guid subCatID)

public List<SubCategory> GetSubCategoryListBySubCatID(Guid subCatID)

除了其他任何内容之外,当您阅读调用代码时,这将使您更清楚自己感兴趣的方法。

如果这些应该以通用方式实现,请编写包含公共核心的私有方法,并从两个公共方法中调用它。例如,您可以使用委托来执行“我已找到结果,将其添加到您的集合”部分,或使用迭代器块:

// "action" will be called on each sub-category
private void FindSubCategoriesBySubCatID(Guid subCatID,
                                         Action<SubCategory> action)

private IEnumerable<SubCategory> FindSubCategoriesBySubCatID(Guid subCatID)

答案 1 :(得分:3)

使用如下的泛型。

    public T GetSubCategoriesBySubCatID<T>(Guid SubCategoryID)
    {
        T value = ...;
        return value;
    }

答案 2 :(得分:0)

我会定义

public IEnumerable<SubCategories> GetSubCategoriesBySubCatID(Guid SubCategoryID);

此方法的实现类可以自由使用任何实现IEnumerable {SubCategories}的集合或容器

答案 3 :(得分:0)

可以做到这就是

许多人已经解释过C#不支持返回类型重载。事实上,它得到了CTS的支持。但是使用接口并且如果应用程序中的场景绝对需要我们可以使用显式接口实现来模拟返回类型方法重载

我们可以定义两个具有相同方法签名但不同返回类型的接口,例如

Interface I1
{
    DataTable GetSubCategoriesBySubCatID(Guid SubCategoryID);
}

Interface I2
{
    List<SubCategories> GetSubCategoriesBySubCatID(Guid SubCategoryID);
}

我们定义了将实现两个接口的类

public class CategoryFinder:I1, I2
{
     public DataTable GetSubCategoriesBySubCatID(Guid SubCategoryID) //Implicitly implementing interface 
     {   
          //processing
          return _dt; 
     }


     List<SubCategories> I2.GetSubCategoriesBySubCatID(Guid SubCategoryID) //explicit implementing interface
     {
           //processing
           return _list<>
     }
}

由于CategoryFinder类实现了两个冲突的GetSubCategoriesBySubCatID,我们必须按如下方式明确地对接口进行类型转换

CategoryFinder cf = new CategoryFinder();
cf.GetSubCategoriesBySubCatID(Guid SubCategoryID); // will call the implicit return type which is data table
((I1)cf).GetSubCategoriesBySubCatID(Guid SubCategoryID); // will return **I1** implementation i.e datatable
((I2)cf).GetSubCategoriesBySubCatID(Guid SubCategoryID); // will return **I2** implementation i.e list