C#Typelist类似于Loki ::带有层次结构生成器的类型列表

时间:2011-07-19 03:30:07

标签: c# loki typelist

我喜欢Loki的C ++ HierarchyGenerator,并希望在C#中做同样的事情。

我最终想要的是一个在给定类型列表中每个参数都有虚函数的类。

我要转换的C ++代码:

template <class T>
class SenderV 
{
public: 
    virtual void Send(T t) = 0;
};
template <int i>
class Foo // Just to make it easy to show typelist, it's not interesting. 
{ /* doIt definition */ };
typedef TYPELIST_2(Foo<1>,Foo<2>) FooSendables;

template <typename TList=FooSendables>
class FooSend : public Loki::GenScatterHierarchy <TList,SenderV>
{
public:
    void Send(Foo<1> f) {f.doIt();std::cout<<"Sending Foo1."<<std::endl;};
    void Send(Foo<2> f) {f.doIt();std::cout<<"Sending Foo2."<<std::endl;};
};

在C#中。如果你不熟悉Loki,上面的FooSend类将默认为:

class FooSend : SenderV<Foo<1> >, SenderV<Foo<2> >//including every type in TList
{ /*... as above */};

但是当给出一个新的TList时,它将是一个基于TList中的类型的不同层次结构。

我也对Loki的GenLinearHierarchy感兴趣,如果它存在的话。

我总是可以尝试在各种语言之间进行翻译,但我并不是尝试这种语言的忠实粉丝,因为我是C#的新手,只是想做我的工作,而不是学习模板和泛型之间的细微差别。

2 个答案:

答案 0 :(得分:0)

我不知道Loki,但它找我使用多重继承。 c#不支持多重继承,多年来我用c#学到的是我不会错过它。

答案 1 :(得分:0)

使用t4:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>

<#@ import namespace="System.Text" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System" #>


namespace SomeNamespace 
{

    public interface Sender<T> 
    {
        void Send<T>(T t);
    };
    <# string[] strings={"Foo1","Foo2","Foo3"};
        foreach (String node in strings) 
        { #> partial class <#= node #> {}
        <# } #>
    class z {}
    public class FooSend: Sender<z><# 
         foreach (String node in strings) 
         { #>, Sender<<#= node #>> <# } #>
    {
    }
}

我无法按照我喜欢的方式获取格式(而且,无论如何,t4格式总是很难看),但这解决了我的问题。

上面的代码产生:

namespace SomeNamespace 
{

    public interface Sender<T> 
    {
        void Send<T>(T t);
    };
     partial class Foo1 {}
     partial class Foo2 {}
     partial class Foo3 {}
     class z {}
    public class ParentClass : Sender<z>, Sender<Foo1> , Sender<Foo2> , Sender<Foo3>  {
    }    
}

符合我的需求。