如果没有`typedef`,如何在c#generics中创建相关类型的组?

作为一个来自C ++背景的人,我遇到了以下情况:

鉴于c#不支持typedef,您如何以编程方式关联类型。 也就是说,在C ++中,我可以将相关类型存储为typedef,以便在与模板一起使用时进行检索。 由于缺少typedef ,同样的方法无法以相同的方式在c#中完成。

例如在C ++中我会:

 template class Thing : public ThingBase {  public:    bool isRelated( T::Parent & otherThing )  { T::Auxillary aux( "Yes" );    return aux.isValid( otherThing ) && data.isParent( otherThing );  }  private:    T data; }; 

这适用于以下任何一种情况:

 class SomeClass { public: typedef SomeClassParent Parent; typedef FooAuxillary Auxillary; bool isParent( Parent & parentObject ); }; class OtherClass { public: typedef OtherClassParent Parent; typedef BarAuxillary Auxillary; bool isParent( Parent & parentObject ); }; 

虽然能够在参数类型上调用T::isParent可以使用通用接口接口实现,但为Thing::isRelated构建签名似乎没有typedef就不可能。

那么,在C#中我该怎么做才能获得T的相关接口类型(在C ++示例中是T :: Interface)?

您需要使用通用约束(在这种情况下可能)使用第二个通用参数作为指示的SLaks。

 interface IRelated { bool isParent(TRelated parentObject); } class SomeClassParent {} class SomeClass : IRelated { bool isParent(SomeClassParent parentObject) { // your logic here return true; } } class Thing : ThingBase where T : IRelated {} 

使用:

 var obj = new Thing(); 

这是另一种选择。 这个需要一些运行时类型检查(并允许使用任何类型的对象调用isParent),但它会清除语法。

 interface IRelated { bool isParent(T parentObject); } class SomeClassParent {} class SomeClass : IRelated { bool isParent(T parentObject) { if (parentObject is SomeClassParent) { // your logic here return true; } } } class Thing : ThingBase where T : IRelated {} 

使用:

 var obj = new Thing(); 

使用通用通用接口来关联类型:

 interface IRelatedTo class Thing where T : IRelatedTo