我需要为数组类创建一个扩展方法,但是这个扩展方法必须能够接受许多数据类型,因此它也必须是通用的。
在下面的代码中,扩展方法只接受字节数据类型。我希望它也接受ushort和uint。 我认为最好的方法是在这里创建泛型类型。但是我怎么能用数组来做呢?
感谢!!!
public static class MyExtensions
{
public static int GetLastIndex(this byte[] buffer)
{
return buffer.GetUpperBound(0);
}
}
答案 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);
}}
但是,用作约束的类型必须是接口,非密封类或类型参数