gpt4 book ai didi

c# - 当调用类本身是泛型时,是否可以强制外部类调用专门的重载?

转载 作者:太空狗 更新时间:2023-10-29 20:21:03 24 4
gpt4 key购买 nike

我正在编写与我无法更改的外部 API 接口(interface)的代码:

public class ExternalAPI
{
public static void Read(byte[] buffer);
public static void Read(int[] buffer);
public static void Read(float[] buffer);
public static void Read(double[] buffer);
}

在将数据读入buffer 时调用正确的重载方法很重要,但是一旦读入数据,我将对其进行一般处理。我的第一遍代码是:

public class Foo<T>
{
T[] buffer;

public void Stuff()
{
ExternalAPI.Foo(buffer);
}
}

不过,C# 不会将 T[] 转换为 byte[]。有没有办法枚举 T 可以显式表示的类型?我试过使用 where T : 子句,但似乎没有办法说 where T : {byte, int, float, double and nothing else ever}?

遵循此处的建议:Generic constraint to match numeric types ,我向泛型添加了约束,还向我的模拟 API 添加了一个泛型方法,该方法采用 object 作为其参数

public class ExternalAPI
{
public static void Read(object buffer);
public static void Read(byte[] buffer);
public static void Read(int[] buffer);
public static void Read(double[] buffer);
}

public class Foo<T> where T: struct, IComparable, IComparable<T>, IConvertible, IEquatable<T>, IFormattable
{
T[] buffer;

public void Stuff()
{
ExternalAPI.Read(buffer);
}
}

这将顺利编译和运行,但唯一被调用的方法是 Foo(object buffer),即使 Tbyte。当调用类是泛型时,是否有办法强制非泛型类的方法使用最具体的重载?

最佳答案

我以前遇到过这种情况,我想出的唯一解决方案是针对 T 的类型进行测试并调用适当的函数;

public class Foo<T>
{
T[] buffer;

public void Stuff()
{
var type = typeof(T);

if (type == typeof(int[]))
{
...
}
else if (type == typeof(double[]))
{
...
}
}
}

关于c# - 当调用类本身是泛型时,是否可以强制外部类调用专门的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14162977/

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