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 аргументов?
Решение
У вас есть несколько вариантов, которых можно определить делегата, которое будет выглядеть как:
public delegate TResult Func<T1,T2,...,TN,TResult>(T1 arg1, T2 arg2,...,TN argN);
Вы можете в основном определить его для любого количества аргументов (выше 4, так как вы можете получить имя столкновения иначе)
Или вы можете обернуть свои аргументы в структуру своего рода, чтобы вы могли использовать один из делегатов Func, уже определенных для вас.
В любом случае вы должны беспокоиться о подписании метода, если вы не можете использовать один из предопределенных делегатов Func. Нередко длинные списки параметров являются запахом, который часто приводит к тому, что метод делает много (несвязанные) работы.
Таким образом, мой личный подход будет выяснить, где дизайн не удался и исправить то, что, а не правильно, что чаще всего является симптомом (в этом случае определяет ФУНК с достаточными соглашениями мог исправить симптому, не говоря, что это так, как я не знаю свой код)
Другие советы
Перейти к более высокой версии .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.
Или, если вы застряли в нижней версии, просто определите делегат самостоятельно.
Я думаю, можно увидеть действие и функцию функции, по крайней мере, с 25 параметрами в рамках 5.0 :)
Нет никаких причин для перемещения в более высокую структуру версии, потому что я не могу восстановить мой код для действительного, поддерживаемого представления. На самом деле не очень хорошая практика использовать так много параметров в методе подписи функции. Используйте объект, который имеет 5 полей или свойств. Вы можете потратить эту сущность без изменения метода или подписи функции.