gpt4 book ai didi

c# - 仅采用数字类型(int double 等)的泛型?

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:36 24 4
gpt4 key购买 nike

在我正在处理的程序中,我需要编写一个函数来获取任何数字类型(int、short、long 等)并将其插入特定偏移量的字节数组。

存在一个接受数字类型并将其作为字节数组返回的 Bitconverter.GetBytes() 方法,并且此方法仅接受数字类型。

到目前为止我有:

    private void AddToByteArray<T>(byte[] destination, int offset, T toAdd) where T : struct
{
Buffer.BlockCopy(BitConverter.GetBytes(toAdd), 0, destination, offset, sizeof(toAdd));
}

所以基本上我的目标是,例如,调用 AddToByteArray(array, 3, (short)10) 将需要 10 并将其存储在数组的第 4 个槽中。存在显式转换是因为我确切地知道我希望它占用多少字节。在某些情况下,我想要一个小到足以真正占用 4 个字节的数字。另一方面,有时我希望将一个 int 压缩成一个字节。我这样做是为了创建一个自定义网络数据包,如果这让您的脑海中浮现出任何想法的话。

如果泛型的 where 子句支持诸如“where T : int || long || etc”之类的东西,我就可以了。 (不需要解释为什么他们不支持,原因很明显)

如有任何帮助,我们将不胜感激!

编辑:我意识到我可以做一堆重载,一个用于我想要支持的每种类型......但我问这个问题是因为我想避免这种情况:)

最佳答案

我不同意这是不可能的;只是我建议的设计有点奇怪(并且涉及)。

这是想法。

理念

定义接口(interface)IBytesProvider<T> ,用一种方法:

public interface IBytesProvider<T>
{
byte[] GetBytes(T value);
}

然后在 BytesProvider<T> 中实现它静态类 Default属性(property)。

如果这听起来很熟悉,那是因为这正是 EqualityComparer<T>Comparer<T>类有效(在大量 LINQ 扩展方法中大量使用)。

实现

以下是我建议您设置的方式。

public class BytesProvider<T> : IBytesProvider<T>
{
public static BytesProvider<T> Default
{
get { return DefaultBytesProviders.GetDefaultProvider<T>(); }
}

Func<T, byte[]> _conversion;

internal BytesProvider(Func<T, byte[]> conversion)
{
_conversion = conversion;
}

public byte[] GetBytes(T value)
{
return _conversion(value);
}
}

static class DefaultBytesProviders
{
static Dictionary<Type, object> _providers;

static DefaultBytesProviders()
{
// Here are a couple for illustration. Yes, I am suggesting that
// in reality you would add a BytesProvider<T> for each T
// supported by the BitConverter class.
_providers = new Dictionary<Type, object>
{
{ typeof(int), new BytesProvider<int>(BitConverter.GetBytes) },
{ typeof(long), new BytesProvider<long>(BitConverter.GetBytes) }
};
}

public static BytesProvider<T> GetDefaultProvider<T>()
{
return (BytesProvider<T>)_providers[typeof(T)];
}
}

返回

现在,最后,完成所有这些后,您只需调用:

byte[] bytes = BytesProvider<T>.Default.GetBytes(toAdd);

无需重载。

关于c# - 仅采用数字类型(int double 等)的泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4620476/

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