2016-08-15 3 views
1

У меня есть конструктор для класса, который выглядит следующим образом:Как передать Func <в T1, в T2, в T3, вне TResult> к конструктору?

public class Class 
{ 
private Func<string, IThirdField, IFourthField, IResultField> resultField; 

public Class(
     IFirstField firstField, 
     ISecondField secondField, 
     Func<string, IThirdField, IFourthField, IResultField> resultField, 
     ISomeOtherField someOtherField) 
} 

Я пытаюсь инициализировать этот класс так:

var classObject = new Class (firstField, secondField, 
Func<string, IThirdField, IFourthField, IResultField> 
resultField, someOtherField); 

Я получаю следующие ошибки:

  • Использование родового типа «Func» требует 1 аргумент типа.

  • Неверный термин выражения "строка".

  • «IThirdField» - это тип, который недопустим в данном контексте.

Что я делаю неправильно?

+0

У вас уже есть метод с необходимой подписью? Что-то вроде: 'IResultField doStuff (строковое значение, IThirdField thirdField, IFourthField 4thField) {/ * ... * /}'? Или вы хотите передать анонимный метод «на лету»? – Corak

+0

@ M.Tach - ответили ниже, чтобы помочь решить проблему? –

+0

Нет, я закончил жестко кодировать вспомогательный метод, чтобы вернуть объект типа IResultField. –

ответ

2

Вам необходимо пройти экземпляр, который отвечает, что подпись Func так:

var obj = new Class (firstField, 
        secondField, 
        (stringVal, thirdFieldVal, fourthFieldVal) => default(IResultField), 
        someOtherField); 

Или если у вас есть именованная функция затем:

var obj= new Class (firstField, 
        secondField, 
        /*your named function*/), 
        someOtherField); 
+1

Насколько я могу судить, обе эти опции передают пять аргументов конструктору, который принимает только четыре аргумента. Как он компилируется? –

0

Вы должны передать его в Func<>

var classObject = new Class (firstField, secondField, 
(stringVal, thirdFieldVal, fourthFieldVal) => { 
    // do something here 

    return something;// where something is of type IResultField 
}, 
someOtherField); 

Передача Func<> - это хороший способ отлично, что вы хотите, с конкретным входом, но не в то время, когда вы даете ему определение этого метода, и если вы хотите получить разные результаты с использованием разных реализаций.

Так что хорошим примером является Linq. Вы можете использовать Where<T>(Func<T, bool> predicate) и дать ему определение того, что вы хотели бы выполнить в то время, когда Where должен использовать его (т. Е. В разных итерациях). Таким образом, выполнение функции откладывается (хотя это вам и остается).

Мне кажется, что вы передаете параметры этому Func<> в конструкторе, а также даете определение метода, который вы хотите выполнить, используя эти параметры. Это мне не показалось бы лучшим решением.

В вашем примере было бы лучше просто определить интерфейс с помощью сигнатуры метода, а затем определить несколько реализаций. Мне кажется, что вы пытаетесь достичь этого с помощью Func<>

+0

+1 Вам не нужно передавать лямбда, если у вас есть метод, который соответствует сигнатуре, вы можете передать этот метод (просто имя, не вызывайте метод). –

+0

Насколько я могу судить, это передает пять аргументов конструктору, который принимает только четыре аргумента. Как он компилируется? –

+0

@MarkSeemann да, это исправлено. Это похоже на надуманный пример того, что делает пользователь, что не имеет для меня никакого смысла –

1

Вам нужно будет передать делегат. Есть различные способы сделать это, но проходя анонимную функцию, может быть простой:

var classObject = 
    new Class(
     firstField, 
     secondField, 
     (str, thrd, frth) => new ResultFieldImp()), 
     someOtherField); 

Здесь я предполагаю, что ResultFieldImp реализует IResultField. Вероятно, вам нужно настроить этот шаг, чтобы сделать все, что на самом деле требуется.

+0

Hi @Mark. Как вы думаете, вы могли бы взглянуть на этот вопрос? http://stackoverflow.com/questions/40198294/how-to-configure-ninject-so-that-it-creates-a-single-instance-per-controller?noredirect1_comment67673663_40198294 – eddy

+0

@eddy Я никогда не использовал NInject, поэтому я не могу вам помочь. Сожалею. –

+0

Без проблем @Mark. Спасибо, в любом случае. – eddy

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