C# 如何编写一个扩展方法,可以为同一输入返回不同的类型?
我想写这样的东西:C# 如何编写一个扩展方法,可以为同一输入返回不同的类型?,c#,C#,我想写这样的东西: public static Int16 Parse(this byte[] buffer, int index) { var v = buffer[index++] << 8; v += buffer[index++]; return (Int16)v; } public static Int32 Parse(this byte[] buffer, int index) {
public static Int16 Parse(this byte[] buffer, int index)
{
var v = buffer[index++] << 8;
v += buffer[index++];
return (Int16)v;
}
public static Int32 Parse(this byte[] buffer, int index)
{
var v = buffer[index++] << 24;
v += buffer[index++] << 16;
v += buffer[index++] << 8;
v += buffer[index++];
return (Int16)v;
}
publicstaticint16解析(这个字节[]缓冲区,int索引)
{
var v=缓冲区[index++]
有没有办法用显式泛型参数实现我想要的功能
没有
我的意思是,您可以将该方法声明为T Parse(这个byte[]buffer,int index)
,这将解决返回值问题。但是,在该方法中,您仍然存在常规处理输入的问题。您需要检查T
,以确定要“解析”的字节数(您并不是真正在解析……它更像是一个字节转换/重新解释转换操作,而“解析”通常指将文本转换为数据)
您只需遵循Convert
、BitConverter
和binarydreader
类的示例就可以做得更好,这些类在方法名称本身中包含类型名称。无论如何,每个方法都需要不同的实现,而且您知道无论如何都需要显式指定类型名称,所以请保持简单e、 通常的解决方案是使用不同的名称-通常是基于类型的后缀
在这种特定的情况下,您的方法是多余的-至少在某些框架中,有用于此的框架方法;您实际上是在实现:
BinaryPrimitives.ReadInt16BigEndian(…)
BinaryPrimitives.ReadInt32BigEndian(…)
(偏移量的指定方式略有不同;在使用跨度的二进制原语
版本中,偏移量是通过切片
实现的)这里通常的解决方案是调用它们ParseInt16
和ParseInt32
,因为C不允许按返回类型重载来回答这个问题,不,你不能只按返回类型重载方法。而且因为这些方法不是“泛型的”然后,使用不同的名称是正确的解决方案。随机问题:为什么第二个版本会简化为short
(丢弃刚刚填充的值的一半);应该是return v
?@DStanley我觉得您可以将类型作为名称的一部分,例如buffer.Parse(index)但这可能只是简单的错误,或者是我与C++ + .@ MR.BOY混合的东西,但根据类型不同,代码不通用,因为你必须根据返回类型指定通用参数,你也可以只使用不同的方法名称。;
与变量x=Parse(y,z)
在特定的情况下,我想我可能会说我想让Endian nes成为一个参数,但我想你可能是对的。我发现在我的另一个问题中,我已经发现这是一个值得问的问题,因为我需要纯语言知识。我想你的意思是Span
而不是Slice
,不过?@Mr.Boy我是指两者;一旦你有一个span(一个数组也可以作为span),你可以对它进行切片以应用偏移量和限制;你的index
用法相当于someSpan.slice(index)
和BinaryPrimitives
一起切片(index)
,谢谢-我刚刚离开文档,我以前从未使用过span
(或者知道它存在)
public static Int16 <Int16>Parse(this byte[] buffer, int index)
{
var v = buffer[index++] << 8;
v += buffer[index++];
return (Int16)v;
}