gpt4 book ai didi

c# - 假设没有 `typedef`,如何创建相关类型组以用于 C# 泛型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:45 33 4
gpt4 key购买 nike

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

鉴于 c# 不支持 typedef,您如何以编程方式关联类型。也就是说,在 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 可以通过通用接口(interface)实现,但为 Thing::isRelated 构建签名似乎没有 typedef 是不可能的。

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

最佳答案

您需要使用通用约束(并且可能在这种情况下)第二个通用参数作为指示的 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>();

关于c# - 假设没有 `typedef`,如何创建相关类型组以用于 C# 泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17755679/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com