C#通用类和使用WCF进行转换

时间:2009-05-29 08:54:38

标签: c# wcf generics casting

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

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 个答案:

答案 0 :(得分:1)

你想:

void Foo<T>(MyGeneric<T> b) where T : Base {}

答案 1 :(得分:0)

我写了这个演员方法

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>());

丑陋的是,必须提供它已经存在的类。可能会有一些改进。

顺便说一句,我无法将其作为扩展方法,以避免第二个通用参数。

答案 2 :(得分:0)

  

在这种情况下,泛型的整体意义是在方法Foo

上获得编译时类型安全性

以这种方式(对于不在实例的祖先中的类型)进行投射的目的是打破类型安全性。不要破坏类型安全以节省类型安全。