[C#] 文字列挿入を外部パラメータ化して、動的に解決したい(別解)
これはなに?
を見て、面白いネタだなぁと思ったので別解です。
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