更新时间:2023-11-29 09:56:04
您可以使用以下方法粗略地模拟类型转换:
[System.Management.Automation.LanguagePrimitives] :: ConvertTo($ Value,$ TargetType)
对于提供自己转换的动态对象,真正的强制转换的行为可能不同于上述方法。否则,我唯一能想到的其他区别就是性能-由于ConvertTo静态方法不提供优化,因此真正的转换可能会更好。
精确地模拟转换,您将需要生成类似以下内容的脚本块:
function GenerateCastScriptBlock
{
param ([type] $ Type)
[scriptblock] :: Create('param($ Value)[{0}] $ Value'-f
[Microsoft.PowerShell.ToStringCodeMethods]: :Type($ Type))
}
然后可以将此脚本块分配给函数或直接调用它,例如:
(&(GenerateCastScriptBlock([int])) 42)。GetType( )
I'd like to cast a .NET object to another .NET type, but:
-as
PowerShell operatorHow would you achieve this?
For example, this is the "PowerShell" way to do it, but I don't want to use -as
:
$TargetType = [System.String]; # The type I want to cast to
1 -as $TargetType; # Cast object as $TargetType
Unfortunately, this does not work:
$TargetType = [System.String];
[$TargetType]1;
.. because PowerShell does not allow the use of variables inside the square brackets, in this scenario.
I am imagining something like:
$TargetType = [System.String];
$TargetType.Cast(1); # Does something like this exist in the .NET framework?
Can it be done with .NET method syntax? Is there a static method that does this?
You can roughly emulate a cast using the following method:
[System.Management.Automation.LanguagePrimitives]::ConvertTo($Value, $TargetType)
A true cast may behave differently than the above method for dynamic objects that provide their own conversions. Otherwise, the only other difference I can think of is performance - a true cast may perform better because of optimizations not available in the ConvertTo static method.
To precisely emulate a cast, you'll need to generate a script block with something like:
function GenerateCastScriptBlock
{
param([type]$Type)
[scriptblock]::Create('param($Value) [{0}]$Value' -f
[Microsoft.PowerShell.ToStringCodeMethods]::Type($Type))
}
You can then assign this script block to a function or invoke it directly, e.g.:
(& (GenerateCastScriptBlock ([int])) "42").GetType()