C# Typelist аналог Loki::Typelist с генератором иерархии
Я любил C++ HierarchyGenerator от Loki и хочу сделать то же самое в 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.
Я также заинтересован в GenLinearHierarchy в Loki, если он существует там.
Я всегда мог пытаться переводить между языками, но я не большой поклонник этого, так как я новичок в C# и просто хочу выполнять свою работу, а не изучать тонкую разницу между шаблонами и шаблонами.
2 ответа
Используя 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> {
}
}
Который соответствует моим потребностям.
Я не имею представления о Локи, но мне кажется, что вы используете множественное наследование. C# не поддерживает множественное наследование, и что я узнал много лет, работая с C#, так это то, что я не скучаю по нему.