C#泛型包装发生器(C# generics wrapper generator)

2019-10-18 00:46发布

我在寻找一个代码生成器(最好用源),让我产生了通用类,我在我的代码的包装类(使用反射)。

我已经做了一些搜索,但似乎无法找到什么,会做什么,我需要在这里,所以我想我会问这里之前,我开始写我自己。 最终,我可能有写我自己,但希望至少得到,如果其他人已经写这样的一个良好的开端。

这是一个有点难以解释什么,我想要它做的,但发生器应让我指定我希望它生成的包装,其泛型类。 它应该通过我指定,以确定哪些将适合基础上,凡在泛型类限制在DLL中的类型。 我与“生成的代码”部分中示例输出linqpad写了一些示例代码。 正如你可以看到它产生的,它可以基于通用类指定的约束的类所有组合。

为什么我要这么做? 我有不少通用的每个班有许多类型参数(其中有许多向上10个型则params的),我想客户端代码进行简化(这也将需要一些定制工作与毯子生成每一个代码生成器一起组合可能的,但我可以处理)。 这样做了之后,我就可以重构底层泛型类要简单(不影响客户端代码),因为它们在此刻,这是不完全有可能在这个阶段并不需要那么多的类型参数。

void Main()
{
    var x = new GenBothFooAgainBarAgain();
    var y = new GenFFoo();
    var z = new GenFFooAgain();
    var a = new GenBothWithChildFooBarFooChild();
    var b = new GenBothWithChildFooBarAgainFooChild();
}

//////////////////////////////////Generated code ////////////////////////////////////
public class GenBothFooBar : GenBoth<Foo, Bar> {}
public class GenBothFooAgainBar : GenBoth<FooAgain, Bar> {}
public class GenBothFooBarAgain : GenBoth<Foo, BarAgain> {}
public class GenBothFooAgainBarAgain : GenBoth<FooAgain, BarAgain>{}
public class GenFFoo : GenF<Foo>{}
public class GenFFooAgain : GenF<FooAgain>{}

public class GenBothWithChildFooBarFooChild : GenBothWithChild<Foo, Bar, FooChild> {}
//public class GenBothWithChildFooAgainBarFooChild : GenBothWithChild<FooAgain, Bar, FooChild> {} - illegal - Don't generate this as FooChild doesn't inherit from FooAgain
public class GenBothWithChildFooBarAgainFooChild : GenBothWithChild<Foo, BarAgain, FooChild> {}
//public class GenBothWithChildFooAgainBarAgainFooChild : GenBothWithChild<FooAgain, BarAgain, FooChild>{} - illegal - Don't generate this as FooChild doesn't inherit from FooAgain


//////////////////////////////////Generated code ////////////////////////////////////

public class Foo : IFoo
{
    public string foo {get; set;}
}

public class FooChild : Foo, IFooChild
{
    public string fooChild {get; set;}
}

public class Bar : IBar
{
    public string bar {get; set;}
}

public class FooAgain : IFoo
{
    public string foo {get; set;}
}

public class BarAgain : IBar
{
    public string bar {get; set;}
}

public class GenF<F>
where F: class, IFoo, new()
{

}

public class GenBoth<F, B>
where F: class, IFoo, new()
where B: class, IBar, new()
{

}

public class GenBothWithChild<F, B, FChild>
where F: class, IFoo, new()
where B: class, IBar, new()
where FChild: class, F, IFooChild, new()
{

}

public interface IFooChild
{
    string fooChild {get; set;}
}

public interface IFoo
{
    string foo {get; set;}
}

public interface IBar
{
    string bar {get; set;}
}

Answer 1:

对于使用C#代码生成/净知识,我想指出你使用T4 -微软的文本模板引擎,都可以免费使用Visual Studio。 这感觉就像C#和ASP.NET之间的混合,所以你应该能够快速跳水英寸

使用设计时的模板 ,你可以指定现有的组件和或反映他们为你通常会做甚至可以使用Visual Studio的自动化CodeModel获得当前解决方案中的类信息,并从它生成代码。 此代码将在Visual Studio中生成项目之前生成。

使用运行时的模板 ,你会“准备”如何产生在设计时的代码,它提供组件来处理,并在运行时生成代码的列表的逻辑。

不幸的是Visual Studio中缺少对T4模板编辑功能,但也有类似的免费工具有形的T4编辑器 。

这段代码可以在T4模板中使用,并认为在mscorlib.dll中所有的通用类和输出文件中写入它们:

<#
    foreach(System.Reflection.TypeInfo type in typeof(string).Assembly
                                                             .DefinedTypes
                                                             .Where(t => t.ContainsGenericParameters))
    {
#><#= type.Name #><<#= string.Join(", ", type.GenericTypeParameters.Select(tp => tp.Name)) #>>
<#  }
#>

希望这可以帮助



文章来源: C# generics wrapper generator