C# 如何将参数作为类而不是字符串传递给新对象?

C# 如何将参数作为类而不是字符串传递给新对象?,c#,powershell,powershell-3.0,C#,Powershell,Powershell 3.0,我似乎无法将$outputStream作为流传递给StreamWriter构造函数。它作为字符串传递,然后调用错误的构造函数,该构造函数期望字符串而不是流 $tcpClient = New-Object System.Net.Sockets.TCPClient $connect = $tcpClient.BeginConnect("localhost", 8080, $null, $null) $success = $connect.AsyncWaitHandle.WaitOne

我似乎无法将$outputStream作为流传递给StreamWriter构造函数。它作为字符串传递,然后调用错误的构造函数,该构造函数期望字符串而不是流

$tcpClient = New-Object System.Net.Sockets.TCPClient        
$connect = $tcpClient.BeginConnect("localhost", 8080, $null, $null)
$success = $connect.AsyncWaitHandle.WaitOne($testTimeoutMs, $true)
[System.Net.Sockets.NetworkStream]$outputStream = $tcpClient.GetStream()
$writer = New-Object System.IO.StreamWriter -ArgumentList $outputStream, [System.Text.Encoding].ASCII
我想invnoke这个()构造函数,但它使用字符串参数而不是流来调用它

这将导致以下错误:

New-Object : Exception calling ".ctor" with "2" argument(s): "The process cannot access the file 'C:\Users\Maciej\System.Net.Sockets.NetworkStream' because it is being used by anothe
r process."
At line:1 char:12
+  $writer = New-Object System.IO.StreamWriter -ArgumentList $outputStr ...
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

如何强制以流而不是字符串的形式传递此参数?

您的问题是试图使用错误的语法访问
[Encoding]
类的静态成员:

[Text.Encoding].ASCII
[Text.Encoding]::ASCII
在PowerShell中,可以使用以下语法访问类型静态成员:

[Text.Encoding].ASCII
[Text.Encoding]::ASCII
根据继承自
[System.Text.Encoding]
.GetType()
,此对象的类型为
[System.Text.asciencoding]
,并应解决您收到的以下问题:

$tcpClient = New-Object -TypeName 'System.Net.Sockets.TCPClient'

$connect = $tcpClient.BeginConnect('localhost', 8080, $Null, $Null)
$success = $connect.AsyncWaitHandle.WaitOne($testTimeoutMs, $True)

$outputStream = $tcpClient.GetStream()
$writer = New-Object -TypeName 'System.IO.StreamWriter' -ArgumentList @($outputStream, [System.Text.Encoding]::ASCII)
作为补充说明,在v5+中,您可以本机调用构造函数方法:

$streamWriter = [IO.StreamWriter]::new($outputStream, [Text.Encoding]::ASCII)

您的问题是试图使用错误的语法访问
[Encoding]
类的静态成员:

[Text.Encoding].ASCII
[Text.Encoding]::ASCII
在PowerShell中,可以使用以下语法访问类型静态成员:

[Text.Encoding].ASCII
[Text.Encoding]::ASCII
根据继承自
[System.Text.Encoding]
.GetType()
,此对象的类型为
[System.Text.asciencoding]
,并应解决您收到的以下问题:

$tcpClient = New-Object -TypeName 'System.Net.Sockets.TCPClient'

$connect = $tcpClient.BeginConnect('localhost', 8080, $Null, $Null)
$success = $connect.AsyncWaitHandle.WaitOne($testTimeoutMs, $True)

$outputStream = $tcpClient.GetStream()
$writer = New-Object -TypeName 'System.IO.StreamWriter' -ArgumentList @($outputStream, [System.Text.Encoding]::ASCII)
作为补充说明,在v5+中,您可以本机调用构造函数方法:

$streamWriter = [IO.StreamWriter]::new($outputStream, [Text.Encoding]::ASCII)

尝试再次明确引用类型[System.Net.Sockets.NetworkStream]$outputStream作为参数?@dsdel Yes。它只是将该类型视为操作系统字符串的一部分。$writer=New Object System.IO.StreamWriter$outputStream[System.Text.Encoding].ASCII-跳过-ArgumentList-至少本地在快速测试中没有出现错误我测试了Q中发布的代码,第一次尝试成功,以下尝试无效(相同的错误“进程…”)-如果我关闭powershell窗口并打开一个新窗口,它将再次工作。它使用
[System.Text.Encoding]:ASCII
而不是
[System.Text.Encoding].ASCII对我有效。(请注意
)再次尝试明确引用类型[System.Net.Sockets.NetworkStream]$outputStream作为参数?@dsdel Yes。它只是将该类型视为操作系统字符串的一部分。$writer=New Object System.IO.StreamWriter$outputStream[System.Text.Encoding].ASCII-跳过-ArgumentList-至少本地在快速测试中没有出现错误我测试了Q中发布的代码,第一次尝试成功,以下尝试无效(相同的错误“进程…”)-如果我关闭powershell窗口并打开一个新窗口,它将再次工作。它使用
[System.Text.Encoding]:ASCII
而不是
[System.Text.Encoding].ASCII对我有效。(注意