问题
Inspired by theses questions:
- Get a specific octet from the string representation of an IPv4 address
- Powershell - Checking IP Address range based on CSV file
I am trying to extend the IPAddress class with an ToBigInt()
method in PowerShell (if even possible) to be able to easily compare (IPv4 and IPv6) addresses using comparison operations along with -lt
and -gt
. E.g.:
([IPAddress]'2001:db8::8a2e:370:7334').ToBigInt() -lt ([IPAddress]'2001:db8::8a2e:370:7335').ToBigInt()
My first attempt:
class IPAddress : System.Net.IPAddress {
[Void]ToBigInt() {
$BigInt = [BigInt]0
foreach ($Byte in $This.GetAddressBytes()) {
$BigInt = ($BigInt -shl 8) + $Byte
}
$BigInt
}
}
Causes an error:
Line | 1 | class IPAddress : System.Net.IPAddress { | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Base class 'IPAddress' does not contain a parameterless constructor.
So apparently, I need to add the ([IPAddress]::new
) constructors to the sub class:
class IPAddress : System.Net.IPAddress {
IPAddress ([long]$NewAddress) : base($NewAddress) { }
IPAddress ([byte[]]$Address, [long]$ScopeId) : base($Address, $ScopeID) { }
IPAddress ([System.ReadOnlySpan[byte]]$Address, [long]$ScopeId) : base($Address, $ScopeID) { }
IPAddress ([byte[]]$Address) : base($Address) { }
IPAddress ([System.ReadOnlySpan[byte]]$Address) : base($Address) { }
[Void]ToBigInt() {
$BigInt = [BigInt]0
foreach ($Byte in $This.GetAddressBytes()) {
$BigInt = ($BigInt -shl 8) + $Byte
}
$BigInt
}
}
Now, the class defintion is accepted but when I try to create an IPAddress
, like:
[IPAddress]'172.13.23.34'
I get a new error:
OperationStopped: Unable to cast object of type 'System.Net.IPAddress' to type 'IPAddress'.
How can I resolve this casting error?
来源:https://stackoverflow.com/questions/63765349/extending-accelerated-net-class-using-the-original-constructors