第 1 部分中我们介绍了将数据转换为更适合的 .NET 数据类型后数据的可用性如何提高。
如果无法为数据找到现有的数据类型以为其提供结构,也可以创建自己的数据类型。
假设您需要处理名称。这是一个名为 [TeamMember]
的自定义数据类型,可以为名称添加结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class TeamMember { [string]$FirstName [string]$LastName
TeamMember([string]$Name) { $newName = [cultureinfo]::InvariantCulture.TextInfo.ToTitleCase($Name) $delimiter = $newName.ToCharArray() -match '[,. ]' | Select-Object -First 1
if ($delimiter.Count -eq 0) { $this.LastName = $Name return }
$array = $newName.Split($delimiter)
switch -Regex ($delimiter) { '[.\s]' { $this.FirstName = $array[0] $this.LastName = $array[1] } '\,' { $this.FirstName = $array[1] $this.LastName = $array[0] } default { $this.LastName = $Name } } } }
|
运行此代码后,定义了名为 [TeamMember]
的新数据类型。现在可以将包含名称的字符串简单地转换为结构化数据类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| PS> [TeamMember]'tobias weltner'
FirstName LastName --------- -------- Tobias Weltner
PS> [TeamMember]'tobias.weltner'
FirstName LastName --------- -------- Tobias Weltner
PS> [TeamMember]'weltner,tobias'
FirstName LastName --------- -------- Tobias Weltner
|
还有个额外的好处,即自动纠正大小写,或者说,您的类可以包含任何您喜欢的魔法。当您后来使用该类型时,您不再需要担心它。
更好的是,当将此类型分配给变量时,它将自动将任何名称转换为新结构,即使在以后的赋值中也是如此:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| PS> [TeamMember]$name = 'Tobias Weltner'
PS> $name
FirstName LastName --------- -------- Tobias Weltner
PS> $name = 'kloVER,kaRL'
PS> $name
FirstName LastName --------- -------- Karl Klover
|
自定义类的自动转换的秘密在于其构造函数。当构造函数接受一个 [string]
类型的参数时,它可以自动将任何字符串转换为新结构。
类的构造函数和类名相同,并且输入参数为 [string]
:
1 2 3 4
| TeamMember([string]$Name) { ... }
|