c# - 我可以从 ac# 9 记录的自动生成方法中隐藏敏感属性值吗?
问题描述
我正在构建一个用户管理系统,其中包含一个要向其发送命令的域主机。由于-only 属性和生成的辅助方法,这些命令都是record
s 。init
但是,我很快遇到了这种方法的问题,例如LoginUserCommand
.
command.ToString()
返回类似这样的内容(添加格式):
LoginUserCommand {
Identity = 10000000-1111-2222-3333-444444444444,
CorrelationId = 20000000-1111-2222-3333-444444444444,
Timestamp = 2013-07-26T16:45:20Z,
IssuingUserId = 30000000-1111-2222-3333-444444444444,
EntityId = a80c081c-cf91-4304-9baa-20fb20c8d9f7,
IPAddress = 127.0.0.1,
Password = ThisIsAPr0blem
}
显然,我可以通过覆盖重要ToString()
的类来解决这个问题。天真地,我可能会做类似的事情
public override string ToString()
{
return base.ToString()
.Replace(Password, "********");
}
ToString()
但我想知道我是否忽略了一些让生成的方法掩盖Password
属性值的内置方法。
解决方案
with
您可以使用语法重新映射您的记录并PrintMembers
改用,我认为这更干净:
public override string ToString()
{
var builder = new StringBuilder();
(this with { Password = null }).PrintMembers(builder);
return builder.ToString();
}
也有人提议引入诸如[PrintMembersIgnore]
记录之类的属性,但没有任何类似的实现。然而,它可以通过代码生成来解决,这是 dotnet 团队建议的方法(参见线程中的评论),已经启动了一个项目。