似乎无法写出通用的读物和放大器。写

时间:2014-01-31 12:17:50

标签: 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] );
}

通过提供更好的匹配,我可以轻松支持自己的类型和第三方类型的序列化。有没有办法在C#中做类似的解决方案?我已尝试过两个通用助手类和&amp;静态函数,但似乎不能让它成为网格。

3 个答案:

答案 0 :(得分:1)

您想要的(模板)根本不存在于C#中。你可以做一些hacky并使用dynamic(以你的方式躲避它),但我真的不推荐它。您可能需要简单地找到一种不同的方法。

答案 1 :(得分:1)

如果您需要,可以使用BinaryFormatter将对象序列化/反序列化为二进制流。

BinaryFormatter documentation on MSDN

答案 2 :(得分:1)

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

有约束的泛型

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了解其工作原理。

dyanamic类型

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

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

我不确定如何通过重载来提供您需要的专业化。