如果没有`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
- 在WebBrowser中调用脚本,并等待它完成运行(同步)
- 通过等待任务或访问其Exception属性,未观察到任务的exception
- 适用于Windows Phone 8.1的HTML敏捷包
- ValidateCredentials()在First Call上返回FALSE,但在后续调用时返回TRUE
- UrlEncode – Javascript与C#
- 如何在Windows Phone 8.1 / Windows 8.1中为http客户端请求操作设置超时
- 是否有可能在c#中模仿这个java枚举代码
- 将C ++移植(非托管)到C#与在C#应用程序中使用C ++作为DLL
- 我可以向PasswordCredential.Properties添加自定义属性吗?