泛型和扩展方法在一起

时间:2010-08-19 12:23:01

标签: c# generics extension-methods

我需要为数组类创建一个扩展方法,但是这个扩展方法必须能够接受许多数据类型,因此它也必须是通用的。

在下面的代码中,扩展方法只接受字节数据类型。我希望它也接受ushort和uint。 我认为最好的方法是在这里创建泛型类型。但是我怎么能用数组来做呢?

感谢!!!

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

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:4)

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

答案 2 :(得分:1)

在普通(非扩展)方法中使用泛型的方式相同:使用通用语法中引入的占位符类型名称:

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

答案 3 :(得分:0)

@RHaguiuda

您可以像

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

但是,用作约束的类型必须是接口,非密封类或类型参数