【问题标题】:Can I generate compiled code at compiling time with Roslyn?我可以在编译时使用 Roslyn 生成编译代码吗?
【发布时间】:2023-03-25 14:41:01
【问题描述】:

我有一个遗留库,它获取所有实现IFoo<T> 的类,将它们实例化为单例,并执行它们的Execute 方法。

我需要有一个短暂的生命周期,并且实现的构造函数通过 DI 注入并且仍然使其与旧系统兼容。但是我不能碰遗留库。

所以我的想法是使用表示瞬态生命周期的相同方法创建一个接口ISuperFoo<T>,并在编译时生成IFoo<T> 包装器,该包装器在每次执行时通过我们的依赖注入框架实例化一个超级foo,并且由旧版库自动拾取。

我一直在研究,似乎可以通过 Roslyn 来做到这一点,在编译时生成代码,就像创建异步/等待状态机时一样。

发现了类似的老问题,但想知道现在是否可以使用https://www.nuget.org/packages/CodeGeneration.Roslyn.BuildTime

基本上我有:

interface IFoo<T>
{
    void Execute(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);
}

容器可以被注入,因为它无论如何都是单例的。

【问题讨论】:

  • 顺便说一句,ServiceLocator 不是 DI。你没有注射任何东西。是的,它“有点”是 IoC,但实际上它是一种反模式。对于您的问题:您可能正在寻找像 Fody 或 PostSharp 这样的 IL 编织。
  • 公平点。我只是想展示问题的简化。我会看看那些谢谢。
  • 你不能使用 Harmony 或 Fody 之类的东西吗? github.com/pardeike/Harmony/wiki

标签: c# roslyn


【解决方案1】:

使用 Source Generators(目前为预览版)您应该能够做到这一点。

https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/

【讨论】:

    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2014-01-16
    • 1970-01-01
    • 2015-11-04
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多