Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET-将多个泛型类型添加到链接的HashMap_C#_.net_Arrays_Generics_Wildcard - Fatal编程技术网

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

C# .NET-将多个泛型类型添加到链接的HashMap,c#,.net,arrays,generics,wildcard,C#,.net,Arrays,Generics,Wildcard,我有一个通用的C#接口,如下所示: public interface ISerialiser<TV> { void Write( BinaryWriter output, TV value ); TV Read( BinaryReader input ); Type GetValueType(); } 公共接口iSeries { 无效写入(二进制写入程序输出,TV值); 电视读取(二进制读取器输入); 类型GetValueType(); } 其中我有几

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

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

    TV Read( BinaryReader input );

    Type GetValueType();
}
公共接口iSeries
{
无效写入(二进制写入程序输出,TV值);
电视读取(二进制读取器输入);
类型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);
    }
}
公共类BooleanSerialiser:iseraliser
{
公共无效写入(BinaryWriter输出,bool值)
{
输出。写入(值);
}
公共bool读取(二进制读取器输入)
{
返回input.ReadBoolean();
}
公共类型GetValueType()
{
返回类型(bool);
}
}
需要将此实现和其他实现添加到链接列表中,如下所示:

private readonly LinkedHashMap<Type,ISerialiser<?>> theSerialisers = 
                 new LinkedHashMap<Type, ISerialiser<?>>();
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);
    }
}
私有只读LinkedHashMap>();
正如您所看到的,我使用Java风格的通配符来表示要添加不同类型的serialiser—我意识到这不可能在C中编译:)


我的问题是:如何“改变现状”,以便能够用我想要的任何类型的序列化程序填充HashMap,并以相同(或类似)的方式调用接口方法当我最终将对象从HashMap中拉出时,您需要创建一个基本接口
ISerializer
,然后创建一个
LinkedHashMap

您的类将如下所示:

private readonly LinkedHashMap<Type,ISerialiser<?>> theSerialisers = 
                 new LinkedHashMap<Type, ISerialiser<?>>();
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);
    }
}
公共接口ISerializer
{
无效写入(BinaryWriter输出,对象值);
}
公共接口ISerializer:ISerializer
{
无效写入(BinaryWriter输出,TValue值);
}
公共类布尔序列化程序:ISerializer
{
公共无效写入(BinaryWriter输出,bool值)
{
输出。写入(值);
}
//显式接口实现,因此不会在IntelliSense中显示
//当您使用类本身(而不是ISerializer)时。
ISerializer.Write(BinaryWriter输出,对象值)
{
如果(!(值为bool))
抛出新ArgumentOutOfRangeException();
写入(输出,(bool)值);
}
}
您还可以从这样的扩展方法中获益

public static GetSerializer<TValue>(this LinkedHashMap<Type, ISerializer> collection)
{
    return (ISerializer<TValue>)collection[typeof(TValue)];
}
公共静态GetSerializer(此LinkedHashMap集合)
{
返回(ISerializer)集合[类型(TValue)];
}

如果您不知道
TV
实际上是什么(因为它可以是您添加到列表中的多个内容之一),那么您打算如何“调用接口方法”(特别是
读取
写入
;使用
GetValueType
)呢?您希望这些方法签名中的
TV
被视为什么类型?@Knaģis:不一定;在另一个问题中,实际调用一个泛型方法的特别困难(这个问题还没有排除)是明确不需要的(这里只调用了无参数的
doSomething()
方法)。@O.R.Mapper:我的错-我不是说“调用接口方法”,我的意思是“调用派生类的方法”。@johnnyboyc:这并没有改变或回答我的问题。这似乎不太管用——ReSharper似乎仍然希望我以“常规”的方式实现ISerialiser方法。