如何在实例化泛型类时避免指定冗余类型

时间:2015-09-12 19:54:38

标签: c# .net generics c#-4.0 interface

我有一个如下定义的通用接口(IAmMeasurable)。我有一个该接口的实现(Sales)。我正在尝试创建一个泛型类(Fact),以便我可以这样实例化它:

var todaySales = new Fact<Sales>();

不幸的是,我被迫做以下事情:

var todaySales = new Fact<Sales, decimal>();

由于Sales被定义为IAmMeasurable<decimal>,这似乎很尴尬。使用decimal

隐含了Sales
public interface IAmMeasurable<TValue> where TValue : struct
{
}

public class Sales : IAmMeasurable<decimal>
{
}

public class Fact<TMeasure, TValue> 
    where TMeasure : IAmMeasurable<TValue> 
    where TValue : struct
{
    public TValue Observed { get; set; }
}

也许这只是语言的限制?或者是否有另一种方法来构建这个以实现我的目标?或者我只是没有正确地思考问题?

在我看来,有些东西是可衡量的,它们是以特定类型衡量的(销售额以美元计算,用十进制表示)。事实是观察一些措施。我观察到今天销售额是100美元(100米)。

1 个答案:

答案 0 :(得分:0)

如果你想避免这种情况,你只需要设计一个TValue Fact为小数的中间类:

public class DecimalFact<TMeasure> : Fact<TMeasure, decimal>
    where TMeasure : IAmMeasurable<decimal>
{
}

即使在第6版中,C#也没有像方法中那样的泛型类型参数推断。顺便说一句,通用类型参数很难被使用。 C#编译器如何知道IAmMeasurable<T> T泛型参数是TValue?也许像TValue is TMeasure这样的新通用约束?谁知道;)

上述解决方案似乎是最佳解决方案,它是通过设计具体化通用参数的最常用解决方案。