c#10:string内插处理

本文介绍了C#10.0中引入的自定义内插处理程序,通过示例展示了如何利用它来实现根据角色控制字符串格式化的功能。例如,对于管理员显示完整信息,而对于查看者则进行脱敏处理。这种方法允许将敏感信息处理逻辑内置到字符串格式化过程中,提高了代码的安全性和灵活性。
摘要由CSDN通过智能技术生成

string内插是指用$"日期:{DateTime.Now.ToString("yyyy年MM月dd日")}。",这种使用方式,在c#10.0时,引进了这种string内插的处理,可以写自定义的处理程序,来提升使用体验。具体用法见下面的代码:

/// <summary>
/// string内插处理类型
/// </summary>
[InterpolatedStringHandler]
public ref struct TestInterpolatedStringHandler
{
    /// <summary>
    /// 构建字符串的stringbuilder
    /// </summary>
    StringBuilder builder;
    /// <summary>
    /// 两个长度是必需的
    /// </summary>
    /// <param name="literalLength"></param>
    /// <param name="formattedCount"></param>
    public TestInterpolatedStringHandler(int literalLength, int formattedCount)
    {
        builder = new StringBuilder(literalLength);
    }


    /// <summary>
    /// 添加非格式化部分,如果被 {}分隔,会调用多次
    /// </summary>
    /// <param name="s"></param>
    public void AppendLiteral(string s)
    {
        builder.Append(s);
    }
    /// <summary>
    /// 添加格式化部分,如果有多个{},会调用多次
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    public void AppendFormatted<T>(T t)
    {
        builder.Append(t?.ToString());
    }
    internal string GetFormattedText() => builder.ToString();
}

那这个自定义的内插处理程序有什么用呢?我们举个实际的例子吧,如果把处理程序带入参数,就能用效的来控制ApppendLiteral和AppendFormatted了。

通过传入角色role,来决定AppendFormatted时,用正常的内容,或是用脱敏的******,这样一来,就把判断处理工作交给了内插处理程序了,当然这只是很少的一块,可以根据role类型,进行不同权限层次的脱敏,从而形成了一个自定义内插脱敏的模块。具体代码如下:

using static System.Console;
using System.Runtime.CompilerServices;
using System.Text;


var name = "张三";
var total = 10000.0m;
var result = TestParameter("admin", $"本次向 {name} 转账:{total} 元");
WriteLine(result);


result = TestParameter("viewer", $"本次向 {name} 转账:{total} 元");
WriteLine(result);


static string TestParameter(string role, [InterpolatedStringHandlerArgument("role")] ParameterInterpolatedStringHandler handler)
{
    return handler.GetFormattedText();
}


[InterpolatedStringHandler]
public ref struct ParameterInterpolatedStringHandler
{
    /// <summary>
    /// 构建字符串的stringbuilder
    /// </summary>
    StringBuilder builder;


    string _role;
    /// <summary>
    /// 两个长度是必需的
    /// </summary>
    /// <param name="literalLength"></param>
    /// <param name="formattedCount"></param>


    public ParameterInterpolatedStringHandler(int literalLength, int formattedCount, string role)
    {
        _role = role;
        builder = new StringBuilder(literalLength);
    }


    /// <summary>
    /// 添加非格式化部分,如果被 {}分隔,会调用多次
    /// </summary>
    /// <param name="s"></param>
    public void AppendLiteral(string s)
    {
        builder.Append(s);
    }
    /// <summary>
    /// 添加格式化部分,如果有多个{},会调用多次
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    public void AppendFormatted<T>(T t)
    {
        if (_role.ToLower() == "admin")
        {
            builder.Append(t?.ToString());
        }
        else
        {
            builder.Append("******");
        }
    }
    internal string GetFormattedText() => builder.ToString();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值