【发布时间】:2022-02-02 16:47:26
【问题描述】:
一些示例代码来说明我在说什么。我有一个具有单一方法的实用程序类。该方法采用一个参数:System.IO.FileInfo 对象。从 PowerShell 方面,我可以传入一个 System.String 对象,一切都“正常工作”。我很好奇,今年我对 PowerShell 的开发越来越多,我很好奇:
- PowerShell 的哪些功能允许这种情况发生?
- 这是否对任何开发人员在 PowerShell 7.x 中的扩展/使用开放? (非内部)
C#:
using System.IO;
using System.Linq;
namespace TestProject
{
public class Utility
{
public string GetFirstLine(FileInfo fileInfo)
{
string firstLine = File.ReadLines(fileInfo.FullName).First();
return firstLine;
}
}
}
PowerShell:
Add-Type -Path "C:\assemblies\TestProject.dll"
$util = [TestProject.Utility]::New()
$util.GetFirstLine("C:\temp\random-log.txt")
注意:我意识到这是一个微不足道的例子。代码旨在快速说明我感兴趣的 PowerShell 功能。
【问题讨论】:
-
PowerShell 如果可能会自动转换;就好像你写了
$util.GetFirstLine(([IO.FileInfo] "C:\temp\random-log.txt"))。 -
功能是指尽可能进行类型转换的能力?
-
这只是隐式转换 - PowerShell 尝试解析正确的方法签名,找不到完全匹配,然后尝试将字符串值转换为目标类型。如果为目标类型注册了类型转换器或类型适配器,则使用它,否则 PowerShell 解析目标类型的构造函数,该构造函数接受源类型的 1 个参数,并使用实例化此类对象的结果(例如
GetFirstLine("C:\temp\random-log.txt")在运行时被评估为GetFirstLine([System.IO.FileInfo]::new("C:\temp\random-log.txt"))) -
@BuddyJoe 我正在使用我的手机 rn,我会在回到全键盘后立即发布答案 :)
-
很高兴知道有官方文档,@BuddyJoe - 尽管链接的主题非常技术性。可以在this answer 中找到关于 PowerShell 自动类型转换/强制转换的更容易理解的摘要。
标签: c# powershell types type-conversion powershell-7.0