.NET - 将多个泛型类型添加到链接的HashMap

时间:2013-12-06 08:35:31

标签: c# .net arrays generics wildcard

我有一个通用的C#接口如下:

public interface ISerialiser<TV>
{
    void Write( BinaryWriter output, TV value );

    TV Read( BinaryReader input );

    Type GetValueType();
}

我有几个实现,这是其中之一:

public class BooleanSerialiser : ISerialiser<bool>
{
    public void Write( BinaryWriter output, bool value )
    {
        output.Write( value );
    }

    public bool Read( BinaryReader input )
    {
        return input.ReadBoolean();
    }

    public Type GetValueType()
    {
        return typeof(bool);
    }
}

这个和其他实现需要添加到链表中 - 如下所示:

private readonly LinkedHashMap<Type,ISerialiser<?>> theSerialisers = 
                 new LinkedHashMap<Type, ISerialiser<?>>();

正如您所看到的,我使用Java样式的通配符来表示要添加不同类型的序列化程序 - 我意识到这不可能在C#中编译:)

我的问题是:我如何'改变'以便我能够用我希望的任何类型的序列化程序填充HashMap,并在我最终拉动时以相同(或类似)的方式调用接口方法HashMap中的对象?

1 个答案:

答案 0 :(得分:0)

您需要创建基础界面ISerializer并改为创建LinkedHashMap<Type,ISerializer>

你的课程看起来像这样:

public interface ISerializer
{
    void Write(BinaryWriter output, object value);
}
public interface ISerializer<TValue> : ISerializer
{
    void Write(BinaryWriter output, TValue value);
}
public class BooleanSerializer : ISerializer<bool>
{
    public void Write( BinaryWriter output, bool value )
    {
        output.Write( value );
    }

    // explicit interface implementation so that it does not show up in IntelliSense 
    // when you use the class itself (instead of ISerializer).
    ISerializer.Write(BinaryWriter output, object value)
    {
        if (!(value is bool))
             throw new ArgumentOutOfRangeException();
        this.Write(output, (bool)value);
    }
}

你也可以从像这样的扩展方法中受益

public static GetSerializer<TValue>(this LinkedHashMap<Type, ISerializer> collection)
{
    return (ISerializer<TValue>)collection[typeof(TValue)];
}