はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】C#10(.NET6)から登場したCallerArgumentExpressionを用いてメソッドのパラメーター名を取得する

はじめに

今回は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.");

neue.cc

上手に使うと色々なことを実現できそうです。