关于Method重载的建议

时间:2010-03-25 11:47:41

标签: c#

请参阅以下方法。

    public static ProductsCollection GetDummyData(int? customerId, int? supplierId)
    {
        try
        {
            if (customerId != null && customerId > 0)
            {
                Filter.Add(Customres.CustomerId == customerId);
            }

            if (supplierId != null && supplierId > 0)
            {
                Filter.Add(Suppliers.SupplierId == supplierId);
            }

            ProductsCollection products = new ProductsCollection();

            products.FetchData(Filter);

            return products;
        }
        catch
        {
            throw;
        }
    }

    public static ProductsCollection GetDummyData(int? customerId)
    {
        return ProductsCollection GetDummyData(customerId, (int?)null);
    }

    public static ProductsCollection GetDummyData()
    {
        return ProductsCollection GetDummyData((int?)null);
    }

1-请建议如何为CustomerId和SupplierId进行重载,因为只能使用GetDummyData(int?)创建一个重载。我应该添加另一个参数来提及第一个参数是CustomerId或SupplierId,例如GetDummyData(int?,string)。或者我应该使用枚举作为第二个参数,并提到第一个参数是CustoemId或SupplierId。

2-这个条件是正确还是只是检查> 0就足够了 - > if(customerId!= null&& customerId> 0)

3-像这样使用Try / catch是正确的吗?

4-传递(int?)null是正确的或任何其他更好的方法。

修改

我找到了其他一些这样的帖子,因为我对Generics一无所知,这就是我遇到这个问题的原因。我对吗?以下是帖子。

Overloaded method calling overloaded method

2 个答案:

答案 0 :(得分:3)

  1. 为什么不创建单独的GetCustomerData(int)GetSupplierData(int)方法? (如果您需要,还可以GetData()GetData(int,int)。)

  2. 如果您将方法参数更改为int而不是int?,那么您只需要(根据自己的判断)检查它们是否大于0.

  3. 在这种情况下不需要try...catch。如果您所做的只是重新抛出异常,那么首先不要去抓它。

  4. 见上文1和2。

  5. 编辑:也许是这样的......

    public static ProductsCollection GetData()
    {
        return GetDataImpl(-1, -1);
    }
    
    public static ProductsCollection GetData(int customerId, int supplierId)
    {
        if (customerId <= 0)
            throw new ArgumentOutOfRangeException("customerId");
    
        if (supplierId <= 0)
            throw new ArgumentOutOfRangeException("supplierId");
    
        return GetDataImpl(customerId, supplierId);
    }
    
    public static ProductsCollection GetCustomerData(int customerId)
    {
        if (customerId <= 0)
            throw new ArgumentOutOfRangeException("customerId");
    
        return GetDataImpl(customerId, -1);
    }
    
    public static ProductsCollection GetSupplierData(int supplierId)
    {
        if (supplierId <= 0)
            throw new ArgumentOutOfRangeException("supplierId");
    
        return GetDataImpl(-1, supplierId);
    }
    
    private static ProductsCollection GetDataImpl(int customerId, int supplierId)
    {
        if (customerId > 0)
            Filter.Add(Customers.CustomerId == customerId);
    
        if (supplierId > 0)
            Filter.Add(Suppliers.SupplierId == supplierId);
    
        ProductsCollection products = new ProductsCollection();
        products.FetchData(Filter);
    
        return products;
    }
    

答案 1 :(得分:1)

你没有对try catch做任何事情,所以为什么要包含它。你的异常无论如何都要冒泡到调用方法,所以只需删除无关的try catch代码。

我会抛弃第二种和第三种方法,因为它们并没有真正做任何事情。除非你有理由保留它们,就像它们是遗留代码一样,否则我会删除它们。这将使代码更加复杂,以备将来支持。