我需要写入和读取二进制流。看起来 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/