为什么需要为以下代码指定泛型类型?

本文关键字:泛型类型 代码 为什么 | 更新日期: 2023-09-27 17:50:22

我有一个接口

public interface ITcpSerializable<T>
{
    Byte[] Serialize();
    T Deserialize(Byte[] data);
}

在我的一个单独的类中,我希望公开以下属性:

public List<ITcpSerializable> RegisteredTypes { get; set; }

问题是我得到以下错误:

使用泛型类型'ITcpSerializable'需要一个类型参数

现在我明白了错误以及如何纠正它,但问题是我不希望将我的RegisteredTypes属性限制为我的ITcpSerializable接口的特定类型实现。

有办法解决这个问题吗?希望我想要完成的是清楚的。

编辑:好吧,我已经完全填满了我想解释的东西。我突然意识到我的想法完全被扭曲了。

为什么需要为以下代码指定泛型类型?

将公共属性约束为特定类型

你必须把ITcpSerializable<T>变成ITcpSerializable。然后用你的通用版本继承它。

interface ITcpSerializable { }
interface ITcpSerializable<T> : ITcpSerializable { }

您可以创建一个非泛型的ITcpSerializable,并从新的非泛型接口继承ITcpSerializable<T>

接口中的泛型类型参数定义被设计为在反序列化给定类型的对象时需要特定类型的类型安全结果。

这个特殊的用例对我来说没有意义,因为你需要有一个对象的实例来反序列化一个不同的实例——这通常不是你想要的方式。

我理解你想要求有一个强类型反序列化器,但使用其他模式(如工厂)会更有意义

此外,您的输入数据是字节[]-除非有一些其他元数据,否则您无法知道需要调用ITCPSerializable的哪个实现者才能获得正确的具体类型。

类型信息可以包含在数据中(例如,包含类型信息的某些头文件),也可以包含在其他契约中(例如,总是相同的类型)。

serialize方法确实是有意义的——因为向对象请求其自身的序列化实例是合理的,但反过来通常是通过其他方式完成的。

所以你的问题的解决方案是删除泛型类型定义(这对你没有帮助)和反序列化方法(这在这个上下文中没有意义),只保留序列化方法。

:

 public interface ITcpSerializable
{
    Byte[] Serialize();
}

并使用工厂实现反序列化。

你可能想让你的独立类也通用,像:

public class MyClass<T> {
    public List<ITcpSerializable<T>> RegisteredTypes { get; set; }
}