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

时间:2011-04-18 11:55:24

标签: c# generics interface types

我有一个界面

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

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

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

问题是我收到以下错误。

  

使用泛型类型   'ITcpSerializable'需要1种类型   参数

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

有解决这个问题的方法吗?希望我想要完成的是明确的。

编辑:好的,我完全塞满了我想要解释的内容。只需点击我的想法就完全倾斜了。请查看此问题,了解我的实际问题:Constrain public property to specific types in List<Type>

4 个答案:

答案 0 :(得分:4)

您必须ITcpSerializable形式ITcpSerializable<T>。然后继承你的通用版本。

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

答案 1 :(得分:2)

您可以从新的非通用界面创建非通用ITcpSerializable并继承ITcpSerializable<T>

答案 2 :(得分:1)

接口中的泛型类型参数定义旨在在反序列化给定类型的对象时要求特定类型的类型安全结果。

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

我知道你想要要求有一个强类型的反序列化器,但使用其他模式(如工厂)是有意义的

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

类型信息可以包含在数据中(即包括类型信息的一些标题)或者包含在某些其他合同中(即,总是相同的类型)。

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

因此,您的问题的解决方案是删除泛型类型定义(对您没有帮助)和Deserialize方法(在此上下文中没有意义),并保留Serialize方法。

如:

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

使用工厂实现反序列化。

答案 3 :(得分:0)

您可能希望将单独的类设为通用,例如:

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