我有一个通用的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中的对象?
答案 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)];
}