C# 我可以在编译时使用Roslyn生成编译代码吗?

C# 我可以在编译时使用Roslyn生成编译代码吗?,c#,roslyn,C#,Roslyn,我有一个遗留库,它获取实现IFoo的所有类,将它们实例化为singleon,并执行它们的executemedhod 我需要有一个短暂的生命周期,实现的构造函数通过DI注入,并且仍然使它与旧系统兼容。但我不能触摸传统图书馆 因此,我的想法是使用表示瞬时生存期的相同方法创建一个接口ISuperFoo,并在编译时生成IFoo包装器,在每次执行中通过我们的依赖注入框架实例化一个T的超级foo,并由遗留库自动拾取 我一直在研究,似乎可以通过Roslyn做到这一点,在编译时生成代码,就像创建async/aw

我有一个遗留库,它获取实现
IFoo
的所有类,将它们实例化为singleon,并执行它们的
execute
medhod

我需要有一个短暂的生命周期,实现的构造函数通过DI注入,并且仍然使它与旧系统兼容。但我不能触摸传统图书馆

因此,我的想法是使用表示瞬时生存期的相同方法创建一个接口
ISuperFoo
,并在编译时生成
IFoo
包装器,在每次执行中通过我们的依赖注入框架实例化一个T的超级foo,并由遗留库自动拾取

我一直在研究,似乎可以通过Roslyn做到这一点,在编译时生成代码,就像创建async/await的状态机一样

发现了类似的老问题,但不知道现在是否有可能

基本上,我有:

interface IFoo<T>
{
    void Execute(T obj);
}
接口IFoo
{
无效执行(T obj);
}
在编译时,我希望生成如下内容:

[EditorBrowsable(false)]
class FooWrapper<T> : IFoo<T>
{
    Container _container;

    public FooWrapper(Container container)
        => _container = container;

    public void Execute(T obj)
        => _container
             .GetInstance<ISuperFoo<T>>()
             .Execute(obj);
}
[EditorBrowsable(false)]
类fooowrapper:IFoo
{
集装箱(u集装箱),;
公共食品包装(容器)
=>_容器=容器;
公共无效执行(T obj)
=>\u容器
.GetInstance()
.执行(obj);
}
容器可以被注入,因为它无论如何都是单例的。

使用源生成器(当前处于预览中),您应该能够做到这一点


请参见

BTW,
ServiceLocator
不是DI。你没有注射任何东西。是的,这有点像国际奥委会,但实际上这是一种反模式。对于你的问题:你可能正在寻找像Fody或PostSharp这样的IL编织。说得对。我只是想把问题简化一下。我来看看,谢谢。你不能用和声或福迪这样的词吗?