我在寻找一个代码生成器(最好用源),让我产生了通用类,我在我的代码的包装类(使用反射)。
我已经做了一些搜索,但似乎无法找到什么,会做什么,我需要在这里,所以我想我会问这里之前,我开始写我自己。 最终,我可能有写我自己,但希望至少得到,如果其他人已经写这样的一个良好的开端。
这是一个有点难以解释什么,我想要它做的,但发生器应让我指定我希望它生成的包装,其泛型类。 它应该通过我指定,以确定哪些将适合基础上,凡在泛型类限制在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;}
}