在C#中的方法链中选择两种不同方法之一

时间:2014-05-29 18:49:37

标签: c# delegation

请考虑以下代码:

decimal userPrice = product.Status == ProductStatusEnum.Presale
   ? pricingHelper.GetUserPresalePricing(sku, user).UserCustomPrice
   : pricingHelper.GetUserProductPricing(sku, user).UserCustomPrice;

是否有某种方法可以放置表达式来确定在方法链中使用哪个方法而不必使用两个完整的方法链?我的想法是使用一个代表,或者使用反射来命名,但这些都不能成为合理的解决方案(特别是通过名字调用)。

在这种情况下,我意识到方法链不长(之后只有一个属性),但想象一个具有更长方法链的场景。我喜欢用方法链接创建大量变量,但是,为了清楚起见,在这样的方法用法不同的长方法链中,我选择临时存储在变量中而不是重复自己。但它必须是那样的吗?

在javascript中,这很简单:

var userPrice = pricingHelper[
   product.Status === ProductStatusEnum.Presale
   ? GetUserPresalePricing
   : GetUserProductPricing
](sku, user).UserCustomPrice;

此外,可能将两个方法中的一个放入变量然后使用该变量,如(坏伪代码):

SomeDelegate = product.Status == ProductStatusEnum.Presale
   ? pricingHelper.GetUserPresalePricing
   : pricingHelper.GetUserProductPricing;

decimal userPrice = SomeDelegate(sku, user).UserCustomPrice;

鉴于C#可以完成函数式语言所能完成的大部分工作,必须有一种方法(不是说它必须比上面的起始代码更好,只是想知道)。

您对这种结构是否有用或比原始代码更清晰的评论也是受欢迎的。

我想到了另一个想法,即在pricingHelper类中,我可以创建一个GetUserPricing方法,该方法采用一个参数来指示是否获得预售或产品定价。嗯...

2 个答案:

答案 0 :(得分:5)

var f = product.Status == ProductStatusEnum.Presale
   ? new Func<Sku, User, CustomPrice>(pricingHelper.GetUserPresalePricing)
   : pricingHelper.GetUserProductPricing;

decimal userPrice = f(user, price).UserCustomPrice;

答案 1 :(得分:2)

你的代码中有重复 - 获得UserCustomPrice(或者你正在'链接')。为什么会这样?因为您的方法的业务逻辑听起来像获得任何产品定价的自定义用户价格。如果您在代码中写下相同的要求,它将看起来像

var productPricing = GetProductPricing(product, user, sku);
decimal userPrice = productPricing.UserCustomPrice;

随着产品定价转移到单独的方法:

private IProductPricing GetProductPricing(Product product, User user, int sku)
{
    if (product.Status == ProductStatusEnum.Presale)
        return pricingHelper.GetUserPresalePricing(sku, user);

    return pricingHelper.GetUserProductPricing(sku, user);
}

现在意图很明确,特别是与JavaScript版本相比。

注意:将来的重构可能会导致将GetProductPricing方法移至pricingHelper