はじめに
今回はCallerArgumentExpression
を用いてメソッドのパラメーター名を取得する方法を紹介したいと思います。
learn.microsoft.com
概要
CallerArgumentExpression
を用いることで、メソッドの引数で渡した真の意味での文字列をキャプチャすることができます。
パラメーターが、別のパラメーターに渡された式を文字列としてキャプチャすることを示します。
CallerArgumentExpressionAttribute クラス (System.Runtime.CompilerServices) | Microsoft Learn
// 「sample」という文字列を取得したい Hoge(sample); // 「Fuga()」という文字列を取得したい Hoge(Fuga()); // 「"あああああ"」という文字列を取得したい Hoge("あああああ");
注意点としてはC#10(.NET6)からの機能なので、現状のUnityでは利用できないので注意してください。一応csc.rsp
+ AssetPostprocessor.OnGeneratedCSProject
を用いればUnity2022.2移行なら可能ではありますが。
使い方
// C#10(.NET6)以降利用可 // CallerArgumentExpression属性に対象の引数名を指定した引数を追加する public static void Hoge(string text, [CallerArgumentExpression("text")] string? textExpression = null) { Console.WriteLine(text); Console.WriteLine(textExpression); } public static string Fuga() => "これはサンプルだ!!!"; public static void Main(string[] args) { var sample = "これはサンプルです。"; // textExpressionは自動で入力されるので、指定してはダメです // text: これはサンプルです。 // textExpression : sample Hoge(sample); // text: これはサンプルだ!!! // textExpression : Fuga() Hoge(Fuga()); // text: あああああ // textExpression : "あああああ" Hoge("あああああ"); // textExpressionを指定するとその値になる // text: いいいいい // textExpression : ううううう Hoge("いいいいい", "ううううう"); }
おまけ
ちょっと脱線しますが、CySharpさんのOSSであるZLogger v2
をこの機能を用いて、構造化ロギングを実現しています。
github.com
var name = "John"; var age = 33; // {"name" : "John", "age" : 33}という情報をCallerArgumentExpressionを用いて取得している logger.ZLogInformation($"Hello my name is {name}, {age} years old.");
上手に使うと色々なことを実現できそうです。