泛型和扩展方法在一起

RHa*_*uda 1 c# generics extension-methods

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

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

谢谢!!!

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

Nol*_*rin 10

扩展方法中的泛型并不是什么特别的东西,它们的行为与普通方法一样.

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

根据您的评论,您可以执行以下操作来有效地限制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);
}
Run Code Online (Sandbox Code Playgroud)

注意:正如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);
}
Run Code Online (Sandbox Code Playgroud)