c# - 似乎无法编写通用的读写

标签 c# generic-programming

我需要写入和读取二进制流。看起来 BinaryWriter & BinaryReader 很合适,但是 BinaryReader 在任何意义上都不是通用的,AFAIK BinaryWriter 似乎不能扩展到基元以外的任何东西。来自 C++ 并且知道 C# 也有泛型编程技术,我认为这将是一个容易解决的问题。

在 C++ 中,我会按照以下方式编写一些内容:

// Default works for primitives since BinaryWriter::Write has overloads
template< typename SinkT, typename SourceT >
static void Save( SinkT& a_Sink, const SourceT& a_Source )
{
    a_Sink.Write( a_Source );
}

// Lets create a better match for some 3rd party vector3 type
template< typename SinkT >
static void Save( SinkT& a_Sink, const SomeVendor::Vector3& a_Source )
{
    Save( a_Sink, a_Source[0] );
    Save( a_Sink, a_Source[1] );
    Save( a_Sink, a_Source[2] );
}

通过提供更好的匹配,我可以轻松地支持我自己的类型和第 3 方类型的序列化。有没有办法在 C# 中做类似的解决方案?我已经尝试过通用帮助程序类和静态函数,但似乎无法完全融入其中。

最佳答案

正如我们在评论中讨论的那样,有 2 种解决方案:

有约束的泛型

static void Save<T, U>(T sink, U source) where T : IWriter,
                                               U : ISerializable
{
       // do stuff using that fact that U is serialisable and T implements IWriter
}

IWriter 的位置:

interface IWriter
{
     void Save<U>(U itemToSave) where U : ISerializable;
}

要进行特化,您只需重载该方法即可。参见 this example这将如何工作。

动态类型

您可以使用dynamic 类型来允许您调用任意方法,但您会失去编译时类型检查。

static void Save(dynamic a, dynamic b)
{
      a.Save(b);
}

我不确定如何使用重载来提供您需要的特化。

关于c# - 似乎无法编写通用的读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21479916/

相关文章:

c++ - 通过模板编译时父子关系

c# - 以两位小数显示货币,但保留所有可用的小数位

c# - Mono.Cecil:操作可能会在运行时不稳定

c# - 在泛型方法中调用特定实现

rust - 是否有任何特征可以指定数字功能?

c++ - 概括 Fortran 中特定声明类型的操作

c# - 如何为返回数组的函数创建单元测试

c# - 使用定界符序列拆分 ICollection<T>

c# - 在 c# 中,Array.ToArray() 执行深度复制吗?

c++ - 我将如何实现一个函数来提取此类的元素?