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)