Func для 5 аргументов

Я работаю с System.Func, но наткнулся на него.

System.Func<TReturn> // (no arg, with return value)
System.Func<T, TReturn> // (1 arg, with return value)
System.Func<T1, T2, TReturn> // (2 arg, with return value)
System.Func<T1, T2, T3, TReturn> // (3 arg, with return value)
System.Func<T1, T2, T3, T4, TReturn> // (4 arg, with return value)

Максимум, который он принимает, составляет 4 аргумента.

Есть ли способ расширить это до 5 аргументов?


person amateur    schedule 27.08.2010    source источник


Ответы (3)


У вас есть несколько вариантов: один из них — определить делегат самостоятельно, который будет выглядеть так:

public delegate TResult Func<T1,T2,...,TN,TResult>(T1 arg1, T2 arg2,...,TN argN); 

вы можете в основном определить его для любого количества аргументов (больше 4, так как в противном случае вы можете получить конфликт имен)

или вы можете обернуть свои аргументы в какую-то структуру, чтобы вы могли использовать один из делегатов Func, уже определенных для вас.

В любом случае вам следует беспокоиться о сигнатуре метода, если вы не можете использовать один из предопределенных делегатов Func. Довольно часто длинные списки параметров - это запах, который часто приводит вас к пониманию того, что метод выполняет много (не связанной) работы.

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

person Rune FS    schedule 27.08.2010

Перейдите на более позднюю версию .NET Framework. Например. .NET 4.0 имеет до 16

http://msdn.microsoft.com/en-us/library/yxcx7skw.aspx

тогда как 3.5 имеет только 4

http://msdn.microsoft.com/en-us/library/yxcx7skw(v=VS.90).aspx

Или, если вы застряли в более ранней версии, просто определите делегата самостоятельно.

person Brian    schedule 27.08.2010
comment
Спасибо за помощь, Брайан. Я застрял в .net 3.5 и не могу обновиться. Не могли бы вы помочь мне определить делегата самостоятельно, поскольку я не слишком хорошо знаком с этим? ваша помощь будет оценена по достоинству. - person amateur; 27.08.2010
comment
Синтаксис приведен в документации: msdn.microsoft. com/en-us/library/bb534303(v=VS.90).aspx - person Brian; 27.08.2010
comment
@Niall: вам нужен синтаксис public delegate TResult Func<T1, T2, T3, T4, T5, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5); и т. д. - person LukeH; 27.08.2010
comment
Я бы не хотел видеть код, который на самом деле использует делегат с 16 параметрами;) - person Thomas Levesque; 27.08.2010

Думаю, в фреймворке 5.0 можно увидеть Action и Func как минимум с 25 параметрами :)

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

person garik    schedule 27.08.2010