2010-08-19 58 views
1

我需要創建一個數組類的擴展方法,但是此擴展方法必須能夠接受許多數據類型,所以它也必須是通用的。一起使用泛型和擴展方法

在下面的代碼中,擴展方法只是接受字節數據類型。我希望它也能接受ushort和uint。 我相信最好的方法是在這裏創建一個泛型類型。但我怎樣才能使用數組呢?

謝謝!

public static class MyExtensions 
{ 
    public static int GetLastIndex(this byte[] buffer) 
    { 
     return buffer.GetUpperBound(0); 
    } 
} 
+3

'arr.Length - 1'不夠好? – leppie 2010-08-19 12:26:38

+1

在這種特殊情況下,您不需要*使用泛型:public static int GetLastIndex(this Array buffer)將起作用 – 2010-08-19 12:29:42

回答

10

擴展方法中的泛型沒有什麼特別之處,它們的行爲與普通方法類似。

public static int GetLastIndex<T>(this T[] buffer) 
{ 
    return buffer.GetUpperBound(0); 
} 

根據你的評論,你可以不喜歡以下有效限制T類型(增加防護語句)。

public static int GetLastIndex<T>(this T[] buffer) where T : struct 
{ 
    if (!(buffer is byte[] || buffer is ushort[] || buffer is uint[])) 
     throw new InvalidOperationException(
      "This method does not accept the given array type."); 

    return buffer.GetUpperBound(0); 
} 

注意:正如Martin Harris在評論中指出的,您實際上並不需要在此使用泛型。所有數組派生的Array類型就足夠了。

如果你想有一個更優雅的解決方案,在略多碼的成本,你可以只創建方法的重載:你在正常(非擴展做仿製藥

public static int GetLastIndex(this byte[] buffer) 
{ 
    return GetLastIndex(buffer); 
} 

public static int GetLastIndex(this ushort[] buffer) 
{ 
    return GetLastIndex(buffer); 
} 

public static int GetLastIndex(this uint[] buffer) 
{ 
    return GetLastIndex(buffer); 
} 

private static int GetLastIndex(Array buffer) 
{ 
    return buffer.GetUpperBound(0); 
} 
+0

@Noldorin:謝謝。是否有可能使這種方法只接受3種數據類型字節,ushort和uint? – RHaguiuda 2010-08-19 12:30:55

+1

@RHaguiuda,如果您只想支持byte,ushort和uint,請爲byte,ushort和uint創建方法重載。泛型不能僅限於支持特定的基元。 – 2010-08-19 12:53:47

+0

@RHaguiuda安東尼普雷格拉姆的方法是正確的;超載該方法。通過使用泛型方法,可以指定以下約束來僅允許值類型作爲類型參數的參數:'public static int GetLastIndex (this T [] buffer)where T:struct {...}'。在使用泛型時,你不能再指定類型(例如,只允許'uint','byte'和'ushort'作爲類型參數的參數),所以我建議你堅持Anthony Pregram的方法在上面的評論中。 – 2010-08-19 12:57:48

4
public static class MyExtensions 
{ 
    public static int GetLastIndex<T>(this T[] buffer) 
    { 
     return buffer.GetUpperBound(0); 
    } 
} 
+0

+1還包括類聲明 – 2010-08-19 12:29:28

1

同樣的方式)方法:使用通用語法推出的佔位符類型名稱:

public static int GetLastIndex<TElement>(this TElement[] buffer) 
0

@RHaguiuda

你可以像

public static class MyExtensions{ 
public static int GetLastIndex<T>(this T[] buffer) where T: Integer 
{ 
    return buffer.GetUpperBound(0); 
}} 

但是,類型作爲約束約束必須是一個接口,一個非密封類或類型參數