2010-09-10 46 views
4

我需要簡化我的方法一定的幫助方法參數

我有這樣的方法

public double ComputeBasicAmount(double basicLimit, double eligibleAmt) 
{ 
    return basicLimit * eligibleAmt; 
} 

示例用法:

Foo foo = new Foo(100, 1000); 
double basicAmt = ComputeBasicAmount(foo.BasicLimit, foo.EligibleAmt) 

這裏的問題是我想要的eligibleAmt動態,因爲有時 它不是真的只有eligbleAmt我傳遞給方法 ..李柯本

Foo foo = new Foo(100, 1000); 
double basicAmt = ComputeBasicAmount(foo.BasicLimit, foo.EligibleAmt/foo.RoomRate) 

我的解決辦法是使用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) 

能誰來幫幫我。在此先感謝...

回答

4

如果乘數取決於該項目,然後要麼你需要通過該項目爲好,你需要返回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) 

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); 

如果沒有那些就是你要找的人,請實驗值在你想要實際價值T提供,以便您可以計算乘數。

首先是非常相似,只是有一個Func<double>計算乘數,當然......這又是很像調用Func<double>計算參數時,要回你原來的版本剛剛需要兩個雙打。

+0

如果我需要T的實際值,我可以使用它,但對於這種情況,我只評估不同對象的double值屬性。謝謝... – CSharpNoob 2010-09-10 05:53:49

0

你會聲明你的方法是這樣的,那麼乘數是一個委託,需要一個Foo對象並返回一個double:

double ComputeBasicAmount(
    double basicLimit, Foo foo, Func<Foo, double> multiplier) 

然後調用它像這樣,通過拉姆達到乘法器:

double basicAmt = ComputeBasicAmount(
    foo.BasicLimit, foo, x => x.EligibleAmt/x.RoomRate); 
+0

這是不正確的,因爲'Foo'實例沒有被傳入,所以'ComputeBasicAmount'沒有什麼可以調用'Func'。 – Enigmativity 2010-09-10 05:22:42

+0

絕對正確,固定。 – 2010-09-10 05:26:25

+0

謝謝,但我的方法是一樣的你的區別是我的是通用的 – CSharpNoob 2010-09-10 05:29:50

0

您應該使用Func<double>,因爲你只使用雙重效果

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

然後調用它像這樣

double basicAmt = ComputeBasicAmount<Foo>(foo.BasicLimit, x => x.EligibleAmt/x.RoomRate) 

但你可以有一個常規的雙參數來代替。

4

你可以聲明它只是作爲一個Func<double>(你是不是使得該方法依賴於Foo類型的方式),並通過任何方法以不帶參數,返回一個雙重的論點:

public static double ComputeBasicAmount(double basicLimit, Func<double> multiplier) 
{ 
    return basicLimit * multiplier(); 
} 

一些例如來電:

class Foo 
{ 
    public double One; 
    public double Two; 
} 


Foo f = new Foo(); 
double result = ComputeBasicAmount(f.One,() => f.Two); 

你也可以有一些其他的方法返回一個double

public static double GetDoubleValue() 
{ 
    return 4.2; 
} 

...並傳遞作爲參數:

double result = ComputeBasicAmount(42,GetDoubleValue); 
+0

你可以做一個通用版本,因爲它不是FOO對象什麼即將通過。謝謝 – CSharpNoob 2010-09-10 05:31:02

+0

噢,我想我不必在這裏使用泛型,因爲我不必通過Type ...感謝的人... – CSharpNoob 2010-09-10 05:32:41

+0

@ user444024:確切地說。由於我們總是希望使用'double'值,所以該方法已經像通用一樣。 – 2010-09-10 05:35:30

0

謝謝你們,有了你們的幫助,我能夠讓我的現有代碼更具可讀性和功能...

class RNB 
    { 
     public RNB(double roomRate, double roomDays) 
     { 
      RoomRate = roomRate; 
      RoomDays = roomDays; 
     } 

     public double RoomRate { get; set; } 
     public double RoomDays { get; set; } 
     public const double BasicLimit = 100; 
    } 

    class HMS 
    { 
     public double Amount { get; set; } 
     public const double BasicLimit = 200; 
    } 

    public static double ComputeBasicAmount(double basicLimit, Func<double> multiplier) 
    { 
     return basicLimit * multiplier(); 
    } 

    static void Main(string[] args) 
    { 
     RNB rnb = new RNB(100, 2); 
     double result = ComputeBasicAmount(RNB.BasicLimit,() => rnb.RoomDays * rnb.RoomRate); 
     Console.WriteLine("RNB Basic Amt: " + result.ToString()); 

     HMS hms = new HMS() { Amount = 1000 }; 
     result = ComputeBasicAmount(HMS.BasicLimit,() => hms.Amount); 
     Console.WriteLine("HMS Basic Amt: " + result.ToString()); 

     Console.Read(); 
    } 

但是我在這裏有一個問題..我想消除BasicLimit逝世因爲我認爲這裏看起來多餘。是否有可能把BasicLimit的ComputeBasicAmount方法內

事情是這樣的..

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

     return obj.BasicLimit * multiplier(); 
    } 

但我必須把這個問題在另一個線程,因爲我覺得它的另一個話題... 見你們那裏...謝謝...