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

标签 c# generics

我正在编写与我无法更改的外部 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/

相关文章:

java - Java 中泛型的访问类型

c# - GetHashCode 覆盖包含通用数组的对象

c# - 找不到有效的 DotNetBrowser 许可证。请确保您已正确设置许可证

c# - EPPlus 多个选项卡 c#

c# - Windows 应用商店应用程序中的异步自定义对话框

c# - ASP.NET MVC - '/' 应用程序中的服务器错误

c# - 是否可以通过序列化将属性应用于对象?

c# - JSON反序列化器继承泛型类型

c# - 拦截泛型类中的方法调用

generics - 集合中的扩展特征