2

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

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

例如在 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可以使用通用接口接口来调用参数类型,Thing::isRelated但如果没有 typedefs,构建签名似乎是不可能的。

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

4

2 回答 2

2

您需要使用通用约束(并且可能在这种情况下)作为 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>();
于 2013-07-19T21:50:22.123 回答
0

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

interface IRelatedTo<TRelated> 
class Thing<T, TRelated> where T : IRelatedTo<TRelated>
于 2013-07-19T21:26:17.550 回答