2010-01-19 32 views
3

在我们的应用程序中,我们有一些AggregatorTypes(从SQL Server复制的想法) 即MinAggregator MaxAggregator,CountAggregator和SumAggregator。如何检查我可以SUM值的给定类型

现在我应该检查Aggregator是否支持所提供的值的类型。对于伯爵来说并不重要。对于Max和Min,我使用检查IComparable。 但什么使用SUM? 我试过转换器,但它也支持字符串。

为什么没有ISummable :)

而且像则IsNumeric检查是不是对我一个解决方案。例如TimeSpan也可以总结。

+0

好代码

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; } } 

部分是什么在你的情况下总结。有一种可吸收的。实现'+'操作符的所有类型都可以被添加,从而得到两个操作数的总和,但是您声明对于可以汇总的某些类型,您不希望它们显示为可汇总的。 – 2010-01-19 12:05:30

+0

是的我知道,字符串实现'+',但它不是总结_concatenation_ – 2010-01-19 12:09:26

+1

实际上,'字符串**没有**运算符。该解释完全由C#编译器提供(如C#规范中定义的,它映射到'string.Concat')。 – 2010-01-19 12:13:34

回答

1

下面是示例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功能(这真是个奇怪的名字:))由马克Gravell从MiscUtil采取

1

实际上,最小/最大它更容易使用Comparer<T>.Default,同时也支持IComparable<T>,处理“解禁”的运营商,等

您可以获取其中的大部分为免费的,如果你使用MiscUtil;我写了一些代码,可以访问泛型操作符,包括Sum,Average等的泛型扩展方法。不幸的是,操作符不能出现在接口上,并且使事情变得更糟,原语不是实际上MethodInfo中有运算符意义(这是直接在IL中提供的) - as discussed here

+0

我可以期待,如果类型实现了+和 - 运算符,它是可以合并的。 – 2010-01-19 12:17:48

+0

@Sergey - 带上面提到的实现,是的:加上+就足以使它可以合并(尽管它也支持内置的类型,比如'int',而不是*(如解释的)真正拥有运算符)。添加+和一个/(int)可以使用'Average'。 – 2010-01-19 12:26:09

+0

hm,但如何处理简单的类型,如短,字节,uint,长等? – 2010-01-19 12:31:10

相关问题