 CallerArgumentExpression属性诊断
CallerArgumentExpression属性诊断
  在C# 10中,我们可以使用 System.Runtime.CompilerServices.CallerArgumentExpressionAttribute 属性来指定一个参数,这个参数会被编译器替换为另一个参数的文本表示形式。这个功能可以帮助开发者在库中创建更具体的诊断信息,方便调试和排查问题。
# 使用示例
下面是一个使用 CallerArgumentExpression 属性的示例,它会测试一个条件,如果条件不成立,会抛出一个异常,并在异常信息中包含条件参数的文本表示形式。
public static void Validate(bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
    if (!condition)
    {
        throw new InvalidOperationException($"Argument failed validation: <{message}>");
    }
}
在这个例子中,我们使用了 CallerArgumentExpression 属性来指定 message 参数,它会被替换为 condition 参数的文本表示形式。如果 condition 参数的值为 false,则会抛出一个 InvalidOperationException 异常,并且异常信息中包含 <condition>。
# 如何使用
当开发者在库中定义一些带有参数的方法时,可以使用 CallerArgumentExpression 属性来指定其中一个参数,这个参数会被替换为另一个参数的文本表示形式。这个功能可以帮助开发者在调试和排查问题时更容易地定位错误。
例如,如果一个库中定义了一个带有条件参数的方法,这个条件参数是一个布尔类型的值,那么开发者可以使用 CallerArgumentExpression 属性来指定一个文本参数,它会被替换为条件参数的文本表示形式。这样,在条件不成立时,库就可以抛出一个包含条件参数的文本表示形式的异常,方便调试和排查问题。
下面是一个示例,演示了如何在库中使用 CallerArgumentExpression 属性来创建更具体的诊断信息:
public class MyLibrary
{
    public static void DoSomething(int value, [CallerArgumentExpression("value")] string? message=null)
    {
        if (value < 0)
        {
            throw new ArgumentException($"Value is less than zero: <{message}>", nameof(value));
        }
        // do something
    }
}
在这个例子中,我们定义了一个带有一个整型参数 value 的静态方法 DoSomething,并使用了 CallerArgumentExpression 属性来指定 message 参数,它会被替换为 value 参数的文本表示形式。如果 value 参数的值小于零,方法会抛出一个 ArgumentException 异常,并且异常信息中包含 <value>。
# 总结
在C# 10中,开发者可以使用 CallerArgumentExpression 属性来指定一个参数,它会被编译器替换为另一个参数的文本表示形式。这个功能可以帮助开发者在库中创建
