代码之家  ›  专栏  ›  技术社区  ›  Stefan Steinegger

C泛型类和使用WCF的强制转换

  •  1
  • Stefan Steinegger  · 技术社区  · 15 年前

    我想编写一个泛型类,该类应使用不同的泛型参数强制转换为自身。

    class Base {}
    class Inherited : Base {}
    
    class MyGeneric<T> {}
    
    // WCF Service interface
    void Foo(MyGeneric<Base> b);
    
    // somewhere else
    MyGeneric<Inherited> inherited;
    Foo(inherited)
    

    我知道这可以在C 4.0中完成,但目前这没有帮助。

    • 我可以为每个人写一个专门的班 MyGeneric<T> 星座图,并有一个隐式类型转换器或实现某个接口。但我想避免这个。
    • 我可以有一个没有泛型的接口,但在本例中,泛型的整体意义是在方法foo上获得编译时类型安全性。所以这不是一个选择。
    • 因为foo是一个操作契约,所以它不能是泛型本身。

    有什么办法可以在C 3.0中解决这个问题吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Marc Gravell    15 年前

    你想要:

    void Foo<T>(MyGeneric<T> b) where T : Base {}
    
        2
  •  0
  •   Stefan Steinegger    15 年前

    我写了这个铸造方法

    public MyGeneric<TTarget> Cast<TTarget, TSource>()
      where TTarget : class
      where TSource : TTarget, T
    {
      return new MyGeneric<TTarget>();
    }
    

    可以这样叫

    MyGeneric<Inherited> inherited;
    Foo(inherited.Cast<Base, Inherited>());
    

    难看的是,我们必须提供它已经存在的类。可能会有一些改进。

    顺便说一下,为了避免第二个泛型参数,我无法使它成为扩展方法。

        3
  •  0
  •   Amy B    15 年前

    在这种情况下,泛型的全部意义是获得方法foo的编译时类型安全性。

    以这种方式强制转换(对于不在实例的祖先中的类型)的目的是破坏类型安全性。不要破坏类型安全以保存类型安全。