2015-07-20 63 views
0

我有一个类描述一个数组,可以序列化为自定义二进制格式,并返回。该数组有一个单一的类型参数,指定其值,可以是int,doublebool。我想写这样的:将C#类型参数约束为一系列基元类型?

class BArray<T> where T: int, double, bool { 
    BArray(T[] values) { ... } 
    byte[] Encode() { ... } 
    T[] Decode(byte[] bytes) { ... } 
    ... 
} 

我知道这不能编译,但有没有办法做到这一点?如果不是,那么接下来做什么最好的方法是什么?实质上,根据数组值的类型,我需要EncodeDecode方法的不同行为。此外,我希望用户类不担心了不同的实现,即下面应该工作:

var ints = new int[] { 1, 2, 3 }; 
var intB = new BArray(ints); 

var dbls = new double[] { 3, 4 }; 
var dblB = new BArray(dbls); 

但使用未实现的类型应该失败:

var strs = new string[] { "this", "should", "fail" }; 
var strB = new BArray(strs); // TYPE ERROR! 

谢谢!

+0

[通用方法与多个约束]的可能重复(http://stackoverflow.com/questions/588643/generic-method-with-multiple-constraints) –

+0

@EhsanSajjad不,请注意,我只有一个类型参数。 ( – liszt

回答

3

这是最好的,你要做的:

abstract class BArray<T> 
{ 
    byte[] Encode(); 
    T[] Decode(byte[] bytes); 
} 

class BArrayInt : BArray<int> { ... } 
class BArrayDouble : BArray<double> { ... } 
... 

static class BArray 
{ 
    public static BArray<int> Create(int[] values) 
    { 
     return new BArrayInt(values); 
    } 
    public static BArray<double> Create(double[] values) 
    { 
     return new BArrayDouble(values); 
    } 
    ... 
} 

每个BArray*类提供的EncodeDecode的实现。 BArray<T>类的用户只需写入BArray.Create(values),它将适用于您定义的int[],double[]等类型的values

+0

)看起来不好.. :( –

+3

@EhsanSajjad它实际上会按照提问者的要求在实践中工作,唯一的区别是,不必写'新的BArray(值)',你必须写'BArray.Create(values )'。 –

+0

我很感谢答案,并且对C#不允许使用更清晰的解决方案感到难过。 – liszt

相关问题