Ich habe Folgendes verwendet, das den Eigenschaftswert zurückgibt, über den zugegriffen werden würde$thing.$prop
, wenn die "Eigenschaft" existieren und keine zufällige Ausnahme auslösen würde. Wenn die Eigenschaft "nicht existiert" (oder einen Nullwert hat), $null
wird sie zurückgegeben: Dieser Ansatz funktioniert im strengen Modus , da er alle abfangen wird.
Ich finde diesen Ansatz nützlich, da damit benutzerdefinierte PS-Objekte, normale .NET-Objekte, PS HashTables und .NET-Sammlungen wie Dictionary als "Enten-Typ-Äquivalent" behandelt werden können , was meiner Meinung nach ziemlich gut zu PowerShell passt.
Dies entspricht natürlich nicht der strengen Definition von "hat eine Eigenschaft", auf die diese Frage ausdrücklich beschränkt sein kann. Wenn die hier angenommene größere Definition von "Eigenschaft" akzeptiert wird, kann die Methode trivial geändert werden, um einen Booleschen Wert zurückzugeben.
Function Get-PropOrNull {
param($thing, [string]$prop)
Try {
$thing.$prop
} Catch {
}
}
Beispiele:
Get-PropOrNull (Get-Date) "Date" # => Monday, February 05, 2018 12:00:00 AM
Get-PropOrNull (Get-Date) "flub" # => $null
Get-PropOrNull (@{x="HashTable"}) "x" # => "HashTable"
Get-PropOrNull ([PSCustomObject]@{x="Custom"}) "x" # => "Custom"
$oldDict = New-Object "System.Collections.HashTable"
$oldDict["x"] = "OldDict"
Get-PropOrNull $d "x" # => "OldDict"
Und dieses Verhalten ist möglicherweise nicht [immer] erwünscht. es ist nicht möglich zwischen x.Count
und zu unterscheiden x["Count"]
.
($object.property -ne $null)
?