我想将 .NET 对象转换为另一个 .NET 类型,但是:
- 目标.NET类型(类)存储在变量中
- 我不想使用
-as
PowerShell 运算符
- 我正在使用复杂的非原始类型
你将如何实现这一目标?
例如,这是“PowerShell”的方式来做到这一点,但我不想使用-as
:
$TargetType = [System.String]; # The type I want to cast to
1 -as $TargetType; # Cast object as $TargetType
不幸的是,这不起作用:
$TargetType = [System.String];
[$TargetType]1;
..因为在这种情况下,PowerShell 不允许在方括号内使用变量。
我正在想象这样的事情:
$TargetType = [System.String];
$TargetType.Cast(1); # Does something like this exist in the .NET framework?
可以用.NET方法语法来完成吗?有没有静态方法可以做到这一点?
您可以使用以下方法粗略地模拟强制转换:
[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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)