在没有"typedef"的情况下,如何创建用于 c# 泛型的相关类型组?
How do create groups of related types for use in c# generics given that there's no `typedef`?
作为一个来自C++背景的人,我遇到了以下情况:
既然c#不支持typedefs,那么如何以编程方式关联类型呢。也就是说,在C++中,当与模板一起使用时,我可以将相关类型存储为typedef以供检索。由于缺少typedef
,在c#中不能以同样的方式完成同样的事情。
例如,在C++中,我会:
template< typename T >
class Thing : public ThingBase<T>
{
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
,但如果没有typedefs,为Thing::isRelated
构建签名似乎是不可能的。
那么,在C#中,我该如何获得T的相关接口类型(在C++示例中是T::interface)?
您需要使用Generic约束(在这种情况下很可能)作为SLaks的第二个泛型参数,如图所示。
interface IRelated<TRelated>
{
bool isParent(TRelated parentObject);
}
class SomeClassParent {}
class SomeClass : IRelated<SomeClassParent>
{
bool isParent(SomeClassParent parentObject)
{
// your logic here
return true;
}
}
class Thing<T, TParent> : ThingBase<T> where T : IRelated<TParent> {}
使用:
var obj = new Thing<SomeClass, SomeClassParent>();
这是另一个选择。这需要一些运行时类型检查(并允许使用任何类型的对象调用isParent),但它清理了语法。
interface IRelated
{
bool isParent<T>(T parentObject);
}
class SomeClassParent {}
class SomeClass : IRelated
{
bool isParent<T>(T parentObject)
{
if (parentObject is SomeClassParent)
{
// your logic here
return true;
}
}
}
class Thing<T> : ThingBase<T> where T : IRelated {}
使用:
var obj = new Thing<SomeClass>();
使用一个通用接口来关联类型:
interface IRelatedTo<TRelated>
class Thing<T, TRelated> where T : IRelatedTo<TRelated>
相关文章:
- 错误处理.将系统错误代码映射到泛型
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何编写将要继承的泛型代码?
- C++17 如何保存泛型可调用对象以供以后使用
- 泛型运算符== 用于非 pod 对象
- 用于泛型类型上的泛型操作的SFINAE
- 代码不适用于 C++ 中的泛型类型 Vector。<T>
- 泛型函数是否可以用于对结构求和
- 定义用于迭代不同容器类型的泛型转换迭代器
- 用于重载的泛型类成员函数
- 用于初始化派生类型的泛型 switch 语句
- 在没有"typedef"的情况下,如何创建用于 c# 泛型的相关类型组?
- 用于传递正则和r值ref参数的泛型宏代码
- 用于存储不同级别指针的泛型变量
- 用于展平容器容器的泛型函数
- 用于存储泛型对象的c++ LinkedList节点
- 用于双和单类型的泛型对称对c++