Грабли на которые наступил по невнимательности, но которых можно было бы избежать, будь интерфейс не такой "всеобъемлющий" :).
Итак, есть некий "суперкласс" (не мой, но пользоваться пришлось) Loader. Этот класс имеет несколько перегруженных методов:- public void Load(LoadType loadType, Type formType, params object[] constructorParameters)
- {
- Load(loadType, null, formType, null, null, constructorParameters);
- }
- public void Load(LoadType loadType, Type formType, LoginValidationHandler loginValidationHandler, params object[] constructorParameters)
- {
- Load(loadType, null, formType, null, loginValidationHandler, constructorParameters);
- }
public delegate string LoginValidationHandler(Trader trader);
Это делегат, который использовался ранее - как видим - он принимает Trader и возвращает строку
Далее в основном коде вызов метода этого класса -
- loader.Load(new FullLoad(), typeof(UtilitiesLauncherNotifyForm), CheckSupportedGroupFunc());
Получилось вот так:
- loader.Load(new FullLoad(), typeof(UtilitiesLauncherNotifyForm),
- ? null
- : "You do not have correct access to launch the support utilitites.\r\n\r\n";
- );
Замена простая - заменили делегат через лямбду.
public delegate string TraderValidationHandler(Trader trader) и Func<Trader, string> анонимный ни разу не один тип. Однако, код написан, он компилируется. Что получаем. А получаем проблему и жесткую... Возвращаясь к перегруженным методам Load:
В случае с делегатом будет вызван метод из строки 5(т.е. с делегатом в конструкторе). А что же будет с вызовом loader.Load через лямбду - будет вызван метод из строки 1 (т.е без делегата). Хуже того - вызов будет такой :
loader.Load(loadType, formType, object[]{Func<Trader, string>})
Т.е параметры конструктора получат анонимную функцию, которую совсем там не ждут. Хорошо, что все просто падало и проблема вылезла сразу. Однако не всегда проблема может проявиться сразу и тогда это может стать реальным злом.
Вывод: params object[] - может быть ЧЕМ УГОДНО и использовать их надо с максимальной осторожностью (а может лучше и не использовать). Универсальный загрузчик - как демисезонное пальто - и зимой холодно и летом - жарко. Вполне можно было обойтись и частными загрузками. На мой взгляд "premature generalization" такое же зло, как и "premature optimization".
P.S.
Don't be evil!