これはなに?

C#6 から $”{hoge}” みたいな感じで文字列に変数が埋め込めるようになったけど、フィールド変数で string a = $”{hoge}”; ってやるとエラーで怒られるのなんで??ねぇなんで??

を見て、面白いネタだなぁと思ったので別解です。

TL;DR;

C# Scripting を使用して、文字列挿入を評価実行します。

サンプルコード

using System;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CSharp.Scripting;

namespace Ex.InterpolatedString
{
    /// <summary>
    /// 文字列挿入に渡すパラメータ
    /// </summary>    
    public class Globals
    {
        public int foo;
        public string bar;
    }

    class Program
    {
        static void Main(string[] args)
        {
            string formattable = "foo={foo} bar={bar}"; // この部分を外部の設定ファイル等にする
            Print(formattable).Wait();
        }

        static async Task Print(string formattable)
        {
            var foo = 123;
            var bar = "abc";

            var code = $"return $\"{formattable}\";"; // C#コード作成
            var globals = new Globals { foo = foo, bar = bar }; // 匿名型にしたいけれど、アクセスできないのでこうしてます
            var result = await CSharpScript.EvaluateAsync<string>(code, globals: globals);

            Console.WriteLine(result);
        }
    }
}

実行結果

% dotnet run
foo=123 bar=abc

この方法の使いどころ

ないかもww
当たり前ですがめっさ遅いです。
ログ出力なんかに使った日には、きっととってもつらい目にあいます。
あ、でも、非同期実行だから大丈夫かな?

最後に

Scriptingコンパイル結果を最初に用意しておいて、使い回せば速度の問題は解決できるかも?

プロジェクト全体はこちらに置きました。
https://github.com/sengokyu/Ex.InterpolatedString