我有一个C#类:
class SomeObject
{
int id;
string displayName;
// And so on..
public override string ToString()
{
return "Hello";
}
}
我有一个命令Get-SomeObject
,它返回SomeObject
的实例。
但是,如果我这样做:
$o = Get-SomeObject
$o
PowerShell会提示SomeObject属性的值,这意味着:
id = 5
displayName = Pikachu
有没有让PowerShell调用该对象的ToString()
方法,所以“Hello”会打印到控制台上吗?
答案 0 :(得分:3)
默认情况下,PowerShell将显示没有格式信息的对象的属性值。对于四个或更少属性,使用表格式。对于五个或更多属性,使用列表格式。如果要控制对象的显示方式,则应通过Update-FormatData
添加格式数据。请参阅Update-FormatData和about_Format.ps1xml上的手册页。
此外,您不应该在ToString()中写入控制台。你的ToString()方法应该只返回一个字符串。顺便说一句,您还可以通过将对象转换为[string]
来获取PowerShell来调用ToString(),例如:
PS C:\> Add-Type -TypeDefinition @'
>>> public class SomeObject
>>> {
>>> public int Id {get; set;}
>>> public string DisplayName {get; set;}
>>> // And so on..
>>>
>>> public override string ToString()
>>> {
>>> return "Hello";
>>> }
>>> }
>>> '@
PS C:\> $o = New-Object SomeObject
PS C:\> [string]$o
Hello
如果您想要遵循格式数据路线,以下是如何执行此操作的示例:
PS C:\> @'
>>> <Configuration>
>>> <ViewDefinitions>
>>> <View>
>>> <Name>SomeObject</Name>
>>> <ViewSelectedBy>
>>> <TypeName>SomeObject</TypeName>
>>> </ViewSelectedBy>
>>> <TableControl>
>>> <TableHeaders>
>>> <TableColumnHeader>
>>> <Label>SomeObject</Label>
>>> </TableColumnHeader>
>>> </TableHeaders>
>>> <TableRowEntries>
>>> <TableRowEntry>
>>> <TableColumnItems>
>>> <TableColumnItem>
>>> <ScriptBlock>$_.ToString()</ScriptBlock>
>>> </TableColumnItem>
>>> </TableColumnItems>
>>> </TableRowEntry>
>>> </TableRowEntries>
>>> </TableControl>
>>> </View>
>>> </ViewDefinitions>
>>> </Configuration>
>>> '@ > SomeObject.format.ps1xml
PS C:\> Update-FormatData .\SomeObject.format.ps1xml
PS C:\> $o
SomeObject
----------
Hello
如果您的SomeObject
类型位于命名空间中,请确保更新上述格式数据中的<TypeName>
元素,以反映命名空间限定类型名称。