2015-07-20 100 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

相關問題