2010-08-27 2 views
1

Я работаю с System.Func, но добрался до камнем преткновения.Func для 5 аргументов

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 аргументов?

ответ

5

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

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

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

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

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

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

9

Перейти к более высокой версии .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

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

+0

Спасибо за помощь Брайан. Я застрял в .net 3.5 и не могу обновиться. Не могли бы вы помочь мне определить делегата самостоятельно, поскольку я не слишком хорошо знаком с этим? ваша помощь будет оценена по достоинству. – amateur

+0

Синтаксис находится в документах: http://msdn.microsoft.com/en-us/library/bb534303(v=VS.90).aspx – Brian

+2

@Niall: Синтаксис, который вам нужен, будет 'public delegate TResult Func < T1, T2, T3, T4, T5, TResult> (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5); 'и т. Д. – LukeH

1

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

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

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