使用Func <T,TResult>作为参数的方法

CSh*_*oob 4 c# delegates functional-programming

我需要一些简化方法的帮助

我有这个方法

public double ComputeBasicAmount(double basicLimit, double eligibleAmt)
{
  return basicLimit * eligibleAmt;
}
Run Code Online (Sandbox Code Playgroud)

样品用量:

Foo foo = new Foo(100, 1000);
double basicAmt = ComputeBasicAmount(foo.BasicLimit, foo.EligibleAmt)
Run Code Online (Sandbox Code Playgroud)

这里的问题是我希望qualifiedAmt是动态的,因为有时候它不仅仅是我传递给方法的eligbleAmt ..就像这样

Foo foo = new Foo(100, 1000);
double basicAmt = ComputeBasicAmount(foo.BasicLimit, foo.EligibleAmt/foo.RoomRate)
Run Code Online (Sandbox Code Playgroud)

我的解决方案是使用Func委托作为参数,但我不知道如何正确使用它

我想要这样的功能

public double ComputeBasicAmount<T>(double basicLimit, Func<T, double> multiplier)
{

 return basicLimt * multiplier;
}

double basicAmt = ComputeBasicAmount<Foo>(foo.BasicLimit, x => x.EligibleAmt/x.RoomRate)
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗.提前致谢...

Jon*_*eet 6

如果乘数取决于该项目,然后要么你就需要通过该项目为好,或者你需要返回Func<T, double>:

public double ComputeBasicAmount<T>(double basicLimit,
                                    Func<T, double> multiplier,
                                    T item)
{    
    return basicLimt * multiplier(item);
}
...

double basicAmt = ComputeBasicAmount<Foo>(
                        foo.BasicLimit,
                        x => x.EligibleAmt / x.RoomRate,
                        foo)
Run Code Online (Sandbox Code Playgroud)

要么

public Func<T, double> ComputeBasicAmount<T>(double basicLimit,
                                             Func<T, double> multiplier)
{    
    return item => basicLimt * multiplier(item);
}
...
var basicAmtFunc = ComputeBasicAmount<Foo>(
                        foo.BasicLimit,
                        x => x.EligibleAmt / x.RoomRate);

var basicAmt = basicAmntFunc(foo);
Run Code Online (Sandbox Code Playgroud)

如果这些都不是您想要的,请解释您希望提供实际值的位置T,以便您可以计算乘数.

第一个非常类似于只Func<double>计算乘数,当然......这反过来就像在计算参数时调用Func<double>,回到原来只需要两个双精度的版本.