gpt4 book ai didi

c# - 泛型和扩展方法一起

转载 作者:太空宇宙 更新时间:2023-11-03 17:16:09 25 4
gpt4 key购买 nike

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

在下面的代码中,扩展方法只接受字节数据类型。例如,我希望它也接受 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);
}

关于c# - 泛型和扩展方法一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3521684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com