我想编写一个泛型类,应该使用不同的泛型参数将其转换为自身。
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>
星座编写一个专门的类,并编写一个隐式转换器或实现某个接口。但我想避免这种情况。有关如何在C#3.0中解决此问题的任何想法?
答案 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
上获得编译时类型安全性
以这种方式(对于不在实例的祖先中的类型)进行投射的目的是打破类型安全性。不要破坏类型安全以节省类型安全。