将C#类型参数约束到一系列基本类型?

时间:2015-07-20 17:29:36

标签: c# polymorphism constraints

我有一个类,用于描述一个可以序列化为自定义二进制格式并返回的数组。此数组具有单个类型参数,指定其值intdoublebool。我想写这样的东西:

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!

谢谢!

1 个答案:

答案 0 :(得分: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),它就适用于values类型int[]double[]等您定义的内容。