Intereting Posts
ASP.NET-повторитель чередует выделение строки без полноразмерного Использование HttpListener Способ заполнения коллекции Unity Как получить значение литерального контента в Repeater C # удаление обработчика событий Как рассчитать расстояние / близость между одним местоположением и другим (c #) GridView RowDataBound не запускается после обратной передачи Когда вам действительно нужна асинхронная работа в веб-среде? Проверка ProductVersion MSI программно Как вы можете представить многоуровневую модель, которая имеет производные classы и члены для служб OData? Луковая архитектура, единица работы и общий шаблон хранилища Как имитировать множественное наследование в C # Невозможно экспортировать HTML-разметку в PDF с помощью API iTextSharp в asp.net с использованием C #? Чтение из StreamReader пакетами Проверьте, является ли строка действительным представлением номера HEX

Как проверить, что я могу значения SUM данного типа

В нашем приложении мы имеем число AggregatorTypes (идея, скопированная с SQL Server), то есть MaxAggregator MaxAggregator, CountAggregator и SumAggregator.

Теперь я должен проверить, поддерживает ли Aggregator тип предоставленных значений. Для графа это не важно. Для Max и Min я использую проверку для IComparable. Но что использовать для СУММ? Я пробовал конвертер, но он также поддерживает строку.

Почему нет ISummable 🙂

Также IsNumeric, как проверка, не является решением для меня. Например, TimeSpan также может суммировать.

Фактически, для min / max проще использовать Comparer.Default , который также поддерживает IComparable , обрабатывает «снятые» операторы и т. Д.

Вы можете получить большую часть этого бесплатно, если вы используете MiscUtil ; Я написал некоторый код, который обеспечивает доступ к родовым операторам, включая общие методы расширения для Sum , Average и т. Д. К сожалению, операторы не могут появляться на интерфейсах, а чтобы ухудшить ситуацию, примитивы фактически не имеют операторов в смысле MethodInfo ( это предоставляется непосредственно в IL) – как обсуждалось здесь .

Вот пример метода IsSummable

 public bool IsSummable(Type type) try { ParameterExpression paramA = Expression.Parameter(type, "a"), paramB = Expression.Parameter(type, "b"); BinaryExpression addExpression = Expression.Add(paramA, paramB); var add = Expression.Lambda(addExpression, paramA, paramB).Compile(); var v = Activator.CreateInstance(type); add.DynamicInvoke(v, v); return true; } catch { return false; } } 

и функция IsAveragable (какое странное имя :))

 public bool IsAveragable(Type type) try { ParameterExpression paramA = Expression.Parameter(type, "a"), paramB = Expression.Parameter(type, "b"); // add the parameters together BinaryExpression addExpression = Expression.Add(paramA, paramB); var avg = Expression.Parameter(typeof(int), "b"); var conv = Expression.Convert(avg,type); BinaryExpression divideExpression = Expression.Divide(paramA, conv); // compile it var add = Expression.Lambda(addExpression, paramA, paramB).Compile(); var divide = Expression.Lambda(divideExpression, paramA, avg).Compile(); var v = Activator.CreateInstance(type); add.DynamicInvoke(v, v); divide.DynamicInvoke(v, 1); return true; } catch { return false; } } 

часть кода, взятого из MiscUtil от Марка Гравелла