2011-06-29 74 views
2

我實現了一個簡單的擴展方法在我的asp.net MVC 3應用拉出來的對象使用泛型會話:如何在調用委託時發送參數列表作爲參數?

public static T GetVal<T>(this HttpSessionStateBase Session, string key, Func<T> getValues) 
    { 
     if (Session[key] == null) 
      Session[key] = getValues(); 

     return (T)Session[key]; 
    } 

這個偉大的工程,如果的GetValues()不需要任何參數。

我試圖編寫一個重載,它需要params object [] args允許我將參數傳遞給getValues()函數,但我不知道應用這些變量的語法是什麼到功能。

這甚至可能嗎?預先感謝您的建議。

回答

4

我認爲你不應該這樣做 - 調用者可以用lambda表達式來處理它。例如:

int x = session.GetVal<int>("index",() => "something".IndexOf("o")); 

這裏,我們擷取呼籲"something"IndexOf傳入參數"o"的想法。所有這些都以簡單的Func<int>捕獲。

+0

好的喬恩,你在這裏得到upvotes ...在這種情況下,我的GetVal函數會是什麼樣子? – IronicMuffin

+0

@IronicMuffin:就像你已經擁有它一樣。 –

+0

是啊,剛看到那個...太棒了!所以在我的()=>我可以調用任何我想要的方法,並將結果或實際方法傳遞給擴展中的getValues調用?我想我並不完全清楚這裏發生了什麼。 – IronicMuffin

0

可以超載添加到您的功能

public static T GetVal<T>(this HttpSessionStateBase Session, string key, Func<IList<object>,T> getValues, IList<object> args) 
{ 
    if (Session[key] == null) 
     Session[key] = getValues(args); 

    return (T)Session[key]; 
} 
+0

所以這將被稱爲一個新的IList(){value1,value2,...}? – IronicMuffin

+0

是的,你是對的 – mathieu

0

你必須定義自己的委託,而不是Func鍵。下面將在這裏完美的工作:

public delegate TResult ParamsFunc<TResult>(params object[] args);