2015-08-16 10 views
2

Мне интересно, можно ли создать какой-то общий список действий/funcs, каждый из которых имеет разные параметры ввода/вывода.Общий список действий/funcs

Причина, по которой я нуждаюсь в этом: у меня есть исполняющий, который выполняет работу с данными из API, каждый из методов этого исполнятеля переходит к другому пути в этом API, и я хочу иметь возможность планировать эти запросы так Я не буду перегружать этот API (они просто заблокируют меня, если я пройду свой порог запросов).

Таким образом, каждый раз, когда вызывается метод в этом executer, я добавляю этот метод и его параметры в список, а другой поток будет запускаться над списком и выполнять методы оттуда с использованием некоторого таймаута.

У меня должна быть эта логика в executer, а не от вызывающего.

Так в основном интересно, если я могу сделать что-то вроде:

List<Func<T,T>> scheduler; 

Без объявления типов по созданию, но вместо того, чтобы добавлять различные типы во время выполнения.

Если есть лучшее решение или образец для этого, пожалуйста, просветите меня.

[править] , очевидно, я не хочу, чтобы осуществить что-то вроде:

Func<List<object>, object> scheduler 
+0

Помогает ли этот вопрос? http://stackoverflow.com/questions/3813261/how-to-store-delegates-in-a-list –

+0

Откуда берутся значения параметров? Если они доступны, когда вы хотите запланировать функцию, просто выполните «Список ». –

ответ

0

Если вы знаете, значения параметров в момент добавления FUNC в список, вы можете просто захватить их в lambda, который применяет Func<T, X, Y, Z ...> и таким образом уменьшает его до Func<T>,, например

Func<T, X> funcToAdd = ... 
Func<T> wrapper =() => funcToAdd(valueForX); 
myFuncList.Add(wrapper); 

Тип списка Func может затем быть просто List<Func<T>>

+0

Как выглядит объявление в списке? Я не могу сохранить его Список >, я должен указать тип – AlexD

+0

Что вы пытаетесь сделать с возвращаемыми значениями? Если funcs может вернуть все, что вы не можете сделать лучше, чем 'Func ' AFAICT –

0

Вы можете сделать List<Tuple<Type, Delegate>> хранить свои функции.

Ниже код работает отлично:

var scheduler = new List<Tuple<Type, Delegate>>(); 

scheduler.Add(
    Tuple.Create<Type, Delegate>(
     typeof(Func<int, int>), 
     (Func<int, int>)(n => n + 1))); 

scheduler.Add(
    Tuple.Create<Type, Delegate>(
     typeof(Func<string, string, int>), 
     (Func<string, string, int>)((x, y) => x.Length + y.Length))); 

Затем нужно будет использовать отражение, чтобы вернуть их от будучи Delegate.

Это была бы хорошая отправная точка.

Смежные вопросы