Как отправить список параметров для использования в качестве аргументов при вызове делегата? - PullRequest
2 голосов
/ 29 июня 2011

Я реализовал простой метод расширения в своем приложении 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 ​​(), но я не знаю, чтосинтаксис заключается в применении этих переменных к функции.

Возможно ли это вообще?Заранее спасибо за совет.

Ответы [ 3 ]

4 голосов
/ 29 июня 2011

Я бы сказал, что вам не нужно этого делать - вызывающая сторона может справиться с этим с помощью лямбда-выражения. Например:

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

Здесь мы фиксируем идею вызова IndexOf на "something" с передачей аргумента "o". Все это запечатлено в простом Func<int>.

0 голосов
/ 29 июня 2011

Вам придется определить свой собственный делегат, а не Func.Здесь отлично подойдет следующее:

public delegate TResult ParamsFunc<TResult>(params object[] args);
0 голосов
/ 29 июня 2011

Вы можете добавить перегрузку к вашей функции

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];
}
...