Это да. Такие вещи, серпя сердце, можно применять только в хорошо известных алгоритмах — как в данном случае. Сам бы за такое давал по пальцам. Но эти знания, почерпнутые из книги Александреску, подвигли меня на изучение хотя бы основ функционального программирования, и эти знания мне очень пригодились при переходе на C# 3.5, LINQ, лямбды и иже с ними.
Ну, на написание данной вещи действительно ушло много времени. Но теперь есть навык, такое же можно писать очень быстро. Но, как вы правильно замтеили, это же блог «Ненормальное программирование».
Рефлексия — это медленно, это ран-тайм проверки, это запутанная архитектура. Любую задачу, которая решается через рефлекшн, можно решить без него. Рефлекшн — это как универсальная тригономтерическая подстановка, вроде и решает проблему, но через такие места…
Типун вам на язык. Рефлексия должна быть последней инстанцией. Если решение проблемы подразумевает рефлексию — вы неправильно ее решаете. Имхо, рефлексия оправдана только для сериализации, любое другое ее использование — это ошибки проектирования и программирования (отельно следует оговрить, конечно Reflection Emit, однако, опять-таки, только для сериализации и, возможно, перформанса.)
Поправил, спасибо. Хотелось бы все-таки избегать мешанины русского и английского, и так на работе уши вянут от «Засабмитай баг на Кью-Эй», «Заэстимировал реквайрмент — эффорт ларджь».
Хм. Да, возможно, вы правы. Но, думаю, анонимные типы в качестве ключей hash-based коллекций вполне имеют право на существование. Например, чтобы посчитать количество Tuple'ов — заполнять ими HashSet.
var a = new Person {Name=«Иван», Surname=«Иванов»};
var b = new Person {Name=«Иван», Surname=«Иванов»};
a.GetHashCode() != b.GetHashCode();
a != b;
То есть, придется еще реализовывать две функции для работы с Dictionary.