[英]Generics and Extension Methods Together
我需要为数组类创建一个扩展方法,但是此扩展方法必须能够接受许多数据类型,因此它也必须是通用的。
在下面的代码中,扩展方法仅接受字节数据类型。 我希望它也接受例如ushort和uint。 我认为最好的方法是在此处创建泛型。 但是我该如何使用数组呢?
谢谢!!!
public static class MyExtensions
{
public static int GetLastIndex(this byte[] buffer)
{
return buffer.GetUpperBound(0);
}
}
扩展方法中的泛型实际上并没有什么特别的,它们的行为与普通方法中的行为相同。
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);
}
public static class MyExtensions
{
public static int GetLastIndex<T>(this T[] buffer)
{
return buffer.GetUpperBound(0);
}
}
使用普通(非扩展)方法中的泛型的相同方法:使用泛型语法中引入的占位符类型名称:
public static int GetLastIndex<TElement>(this TElement[] buffer)
@RHaguiuda
您可以像这样进行约束
public static class MyExtensions{
public static int GetLastIndex<T>(this T[] buffer) where T: Integer
{
return buffer.GetUpperBound(0);
}}
但是,用作约束的类型必须是接口,非密封类或类型参数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.