【问题标题】:Why do you need to specify generic type for the following code为什么需要为下面的代码指定泛型类型
【发布时间】:2011-08-07 19:55:18
【问题描述】:

我有一个界面

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>

【问题讨论】:

    标签: c# generics interface types


    【解决方案1】:

    您可以创建一个非泛型ITcpSerializable 并从新的非泛型接口继承ITcpSerializable&lt;T&gt;

    【讨论】:

      【解决方案2】:

      您必须创建一个ITcpSerializable 形式的ITcpSerializable&lt;T&gt;。然后用你的通用版本继承它。

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

      【讨论】:

        【解决方案3】:

        你可能还想让你的单独的类也通用,比如:

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

        【讨论】:

          【解决方案4】:

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

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

          我了解您希望有一个强类型的反序列化器,但使用其他模式(如工厂)是有意义的

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

          类型信息可能包含在数据中(即包含类型信息的某些标头)或某些其他合同(即始终相同的类型)。

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

          因此,解决您的问题的方法是删除泛型类型定义(这对您没有帮助)和 Deserialize 方法(在这种情况下没有意义),而只保留 Serialize 方法。

          如:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-30
            • 1970-01-01
            相关资源
            最近更新 更多