如何在C#中将通用对象分配给非泛型引用

Fua*_*kov 3 c# generics

我是一个Java人,并试图在C#中实现一些代码.我做了一个小时的研究,但找不到任何.我有一个我声明为Generic的接口

interface TypeSerializer<T>
Run Code Online (Sandbox Code Playgroud)

然后我有两个这样的实现.

class StringSerializer: TypeSerializer<String> 
Run Code Online (Sandbox Code Playgroud)

class ByteArraySerializer: TypeSerializer<byte[]> 
Run Code Online (Sandbox Code Playgroud)

现在我想用这些实例创建一个数组,并将数组称为TypeSerializer.是这样的:

TypeSerializer[] serializers = 
new TypeSerializer[2] {new ByteArraySerializer(), new StringSerializer()};
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,但在Java中,类似的代码会编译.

我也试过了......

TypeSerializer<Object>[] serializers = 
new TypeSerializer<Object>[2] {new ByteArraySerializer(), new StringSerializer()};
Run Code Online (Sandbox Code Playgroud)

仍然没办法.

如何在不知道通用类型的情况下声明此数组并到达实例.

编辑

基于下面的答案,很明显我应该有两个接口; 有和没有通用.这是接口方法.你能否告诉我们如何实施它们.

public interface ITypeSerializer<T>:TypeSerializer
{
    void write(BinaryWriter writer, T obj);
    T read(BinaryReader reader);
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ram 5

您可以创建泛型版继承的接口的非泛型版本,这会像往常一样强制实现类.

interface ITypeSerializer { }
interface ITypeSerializer<T> : ITypeSerializer { }
class StringSerializer : ITypeSerializer<string> { } // implements ITypeSerializer, too 

// non-generic array
ITypeSerializer[] serializers = ...
Run Code Online (Sandbox Code Playgroud)

您需要的任何方法ITypeSerializer都应该接受或返回object,实现通常是泛型版本的传递方法.

一个实现示例:

public interface ITypeSerializer
{
    void Write(BinaryWriter writer, object obj);
    object Read(BinaryReader reader);
}

public interface ITypeSerializer<T> : ITypeSerializer
{
    void Write(BinaryWriter writer, T obj); 
    T Read(BinaryReader reader);
}
Run Code Online (Sandbox Code Playgroud)

实现时ITypeSerializer<T>,还需要提供ITypeSerializer方法的实现.一种常见的模式是显式地实现泛型和非泛型,这样非泛型方法只有在通过接口引用类时才可见.

class StringSerializer : ITypeSerializer<string>
{
    // implicit implementation of ITypeSerializer<string>
    public void Write(BinaryWriter writer, string obj)
    {
        // provide core implementation here
    }

    public string Read(BinaryReader reader)
    {
        // provide core implementation here
    }

    // explicit implementation of ITypeSerializer
    void ITypeSerializer.Write(BinaryWriter writer, object obj)
    {
        if (!(obj is string)) throw new ArgumentException("obj");

        this.Write(writer, (string)obj);
    }

    object ITypeSerializer.Read(BinaryReader reader)
    {
        return this.Read(reader);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意非泛型方法是如何简单地传递给通用对应方的.