Привет
Мелкие вопросы, как всегда, воспринимать как предложения, а не "нужно сделать вот так"
1. Objects.Random нужно или выпилить или хранить в ThreadLocal, он
не потокобезопасный
2.
Можно в пару предложений — зачем нам нужен exception.GetText()?
Вопрос отпал, rameel ниже ответил.
В exception.GetText() есть мелкий косяк: в конце текста всегда пустая строка.
3. EqualityComparer.GetHashCode():
генерится
{
var num = 321595348; // рандом
num = num * -1521134295 + EqualityComparer<string>.Default.GetHashCode(p.Prop2);
num = num * -1521134295 + EqualityComparer<int>.Default.GetHashCode(p.Field1);
return num;
}
3.1. Надо бы использовать HashCode.Combine() — там используется стандартный алгоритм из Tuple.
3.2. После 3.1. рандомный seed можно убрать, он на распределение особо не влияет
3.3. Было бы круто допилить comparer под реальные сценарии — в 99.99% случаев надо сравнивать по определённым полям. Ну, т.е. нужен builder с синтаксисом аля
var comparerBuilder = new EqualityComparerBuilder<SomeType>
{
{ t => t.PropertyA },
{ t => t.PropertyB.PropertyC },
{ t => t.PropertyC.GetSomeValue() }
};
var comparer = comparerBuilder.ToComparer();
И, возможно, закинуть методы для компарера в Operators<T>, сам код с генерацией — в OperatorsFactory<T> — но это только как всё устаканится.
3.4. С учётом 3.3. А не замахнуться ли по аналогии ещё и на IComparer<T>?
4. AggregateOrDefault — надо бы докинуть перегрузки с TAccumulate, как в стандартном Aggregate().
5.
Было бы круто привести код в соответствие с общими соглашениями по форматированию.
Если есть решарпер — он должен подсветить все проблемные места. Если нет — я займусь, но когда время будет — хз.
Уже сделано AVK, спасибо!
В остальном — круто, отдельное спасибо за TypeAccessor