我对PowerShell字符串嵌入语法的理解"$($object)"
一直是$object
被转换为 [System.String]
,它调用 $object.ToString()
.但是,我注意到 [DateTime]
的这种奇怪行为。在 Windows 8.1 上使用 PowerShell 4.0 类。
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 转换为字符串 vs ToString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30538994/