gpt4 book ai didi

.net - Get-Date 转换为字符串与 ToString()

转载 作者:行者123 更新时间:2023-12-03 03:43:49 24 4
gpt4 key购买 nike

我对 PowerShell 字符串嵌入语法 "$($object)" 的理解一直是 $object 被强制转换为 [System.String],它调用 $object.ToString()。但是,我注意到在 Windows 8.1 上使用 PowerShell 4.0 的 [DateTime] 类存在这种奇怪的行为。

PS> $x = Get-Date

PS> $x.GetType() | select -ExpandProperty Name
DateTime

PS> $x.ToString()
2015-05-29 13:36:06

PS> [String]$x
05/29/2015 13:36:06

PS> "$($x)"
05/29/2015 13:36:06

似乎 "$($object)" 提供了与转换为字符串相同的行为,但显然产生了与 $object.ToString() 不同的结果。 $x.ToString() 与 intl.cpl 中设置的短日期格式(yyyy-MM-dd)一致。 [String]$x 似乎使用 en-US 默认值。

这可能只是 DateTime 类中的一个错误,但更令我惊讶的是,将对象转换为字符串的不同方法会产生不同的结果。如果不调用 ToString(),则将对象转换为字符串的规则是什么? DateTime 类是否只是一个特殊情况,因为它重载了 ToString(String)

最佳答案

如果对象实现了 IFormattable 接口(interface),则 PowerShell 将调用 IFormattable.ToString 而不是 Object.ToString 进行转换操作。静态 Parse 方法也会发生类似的情况:如果存在 IFormatProvider 参数的重载,则会调用该方法。

Add-Type -TypeDefinition @'
using System;
using System.Globalization;
public class MyClass:IFormattable {
public static MyClass Parse(string str) {
return new MyClass{String=str};
}
public static MyClass Parse(string str,IFormatProvider fp) {
return new MyClass{String=str,FormatProvider=((CultureInfo)fp).DisplayName};
}
public string String {get;private set;}
public string FormatProvider {get;private set;}
public override string ToString() {
return "Object.ToString()";
}
string IFormattable.ToString(string format,IFormatProvider fp) {
return string.Format("IFormattable.ToString({0},{1})",format,((CultureInfo)fp).DisplayName);
}
}
'@
[String](New-Object MyClass) #Call IFormattable.ToString(null,CultureInfo.InvariantCulture)
[MyClass]'Test' #Call MyClass.Parse("Test",CultureInfo.InvariantCulture)

关于.net - Get-Date 转换为字符串与 ToString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42210487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com