C波源発生器革命


それとともに.NET 5では、マイクロソフトがCソースを生成しました.
そして、私の最初の発電機を作成した後、私はそれがクールな機能の一つと考えています.NET開発者が使用できます.

しかし、ソースジェネレータは何ですか?


コードを解析し、動的にファイルを生成し、ビルドパイプラインに注入するプログラムです.

使用例?

  • JSONからC
  • を使用してPOCOクラスを拡張する
  • POCOクラスからのビルダーの生成
  • マッピングの拡張メソッドを生成する
  • 超塩基例


    各発電機は2つの方法を持っています:既存のコードを分析するものと新しいコードを生成するもの.
    [Generator]
    public class MyGenerator : ISourceGenerator
    {
        public void Initialize(GeneratorInitializationContext context) { }
    
        public void Execute(GeneratorExecutionContext context) { }
    }
    
    C単位のクラスを生成する
    var source = @"
    namespace Dev.To {{
        public class Post {{
            public string Title {{ get; set; }}
        }}
    }}";
    context.AddSource("Post.cs", SourceText.From(source, Encoding.UTF8));
    
    あまり見えないかもしれない.しかし、部分クラスや拡張メソッドで何ができるかについて考えてください.

    どうやって使うの


    あなたが働くならば.あなたがよく知っているかもしれないネット芯appsettings.json .
    私たちはよくJSONを表すPOCOクラスを作成し、それからスタートアップでそれらを登録する必要がありますIOptions<> .
    なぜ、我々はソースジェネレータに我々のために重い持ち上げをしさせませんか?
    それで、私は正確にそれをするプレビューnugetをつくります!
  • 読めるappsettings 内容
  • 各オブジェクトプロパティに対して、新しいC
  • プライベートスタートアップクラスRegisterOptions 新しいクラスを登録するメソッドservices.Configure<PropertyName>(Configuration.GetSection(nameof(PropertyName)));
  • 人々がする必要がある唯一のものは、彼らを作ることですStartup 部分的呼び出しRegisterOptions インConfigureServices メソッド.
  • このJSON
    {
      "MyOtherOptions": {
        "MyString": "any",
        "MyInt": 1,
        "MyDouble": 1.1,
        "MyBool": true,
        "MyObject": {
          "MyObjectString": "any"
        },
        "MyArray": [ "any" ]
      }
    }
    
    これらのクラスを生成します:

    生成内容:
    // MyOtherOptions.cs
    public class MyOtherOptions
    {
        public string MyString { get; set; }
        public int MyInt { get; set; }
        public double MyDouble { get; set; }
        public bool MyBool { get; set; }
        public MyObject MyObject { get; set; }
        public string[] MyArray { get; set; }
    }
    
    // Startup.Generated.cs
    public partial class Startup
    {
        private void RegisterOptions(IServiceCollection services)
        {
            services.Configure<MyOtherOptions>(Configuration.GetSection(nameof(MyOtherOptions)));
        }
    }
    

    最終語


    ご覧の通り、この新機能の背景にはたくさんの可能性があります.
    それは完全に反射を置き換えることはありませんが、大幅にライブラリの多くのパフォーマンスを向上させることができます!
    しかし、プレビューでは、制限があり、物事が変更される可能性がありますので、そのことを念頭に置いておく!
    私の例のコードを見つけることができますhere on GitHub .

    便利なリンク

  • Introducing C# Source Generators
  • Source Generators Cookbook
  • The pain points of C# source generators
  • Source generators colletion