PowerShell 类方法返回类型作为参数(如 JavaScriptSerializer.Deserialize)

问题描述 投票:0回答:1

我正在尝试在类中构建一个方法,该方法接受所需的返回类型作为参数。 System.Web.Script.Serialization.JavaScriptSerializer 类的反序列化方法就是一个示例。它需要两个参数,一个 JSON 文本和预期返回的返回类型。如果我要做类似下面的事情,并且提供 $JSONConect 包含有关我想要使用的类的有效信息,我会得到一个 [Test] 类型的正确对象

$JSSerializer   = New-Object System.Web.Script.Serialization.JavaScriptSerializer
$JSONObject     = [MyData]::New( )
If( $JSONContent -ne $null )
{
    $JSONObject     = $JSSerializer.Deserialize( $JSONContent, [MyData] )
}

我尝试构建这样的东西,但我在返回类型上遇到错误。

class Test
{
    [Type] TestType( [Type]$AParam )
    {
        Write-Host "Your provided the type  : $AParam"

        $Result = New-Object $AParam

        Write-Host "Your provided the value : $Result"

        Switch( $AParam )
        {
            "bool"
            {
                Write-Host "Your provided the type  : `"Boolean`""
                $Result = $True
            }
            "int"
            {
                Write-Host "Your provided the type  : `"Integer`""
                $Result = 2
            }
            "string"
            {
                Write-Host "Your provided the type  : `"String`""
                $Result = "Miep"
            }
            Default
            {
                Write-Host "Your provided the type  : `"Invalid!`""
                $Result = $null
            }
        }

        #$Result = [$AParam.GetType( )]
        #return $Result

        #return [Type]$( $AParam )
        return Write-Output -NoEnumerate $Result
    }
}

[bool]$tBool     = $False
[int]$tInt       = 0
[string]$tString = ""


$MyTest = [Test]::New( )

$tBool   = $MyTest.TestType( [bool] )
$tBool

exit
$tInt    = $MyTest.TestType( [int] )
$tInt

$tString = $MyTest.TestType( [string] )
$tString

#$MyTest.TestType( $tBool )
#$MyTest.TestType( $tInt )
#$MyTest.TestType( $tString )

上面的代码部分有效,我可以只提供一个类型作为参数。但它不会返回任何东西。正如您所看到的,我尝试了三种方法来使其正常工作,但我不断收到错误。

使用上面的代码,我收到以下错误:

Your provided the type  : bool
Your provided the value : False
Your provided the type: "Boolean"
Cannot convert value "True" to type "System.Type". Error: "Invalid cast from 'System.Boolean' to 'System.Type'."
At D:\ParameterTypePassingUsng.ps1:39 char:16
+         return Write-Output -NoEnumerate $Result
+                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastIConvertible
 
False

如果可能的话,对于如何完成这项工作有什么建议吗?我无法使用 CmdLets 执行此操作,因为我刚刚重新设计了整个库以使用类而不是单独函数的集合。

powershell
1个回答
0
投票

Mathias 暗示,您似乎正在寻找的是 C# 中的通用方法,但是 PowerShell 类 不支持此功能。

该错误告诉您,在您的方法签名中,您声明该方法将采用

Type
作为输入并返回
Type
作为输出,并且您没有履行此合同,因为您试图返回类型或 $null
实例(
int
string
bool
$null
)。

通过将签名更改为返回类型

[object]
,代码将正常工作:

[object] TestType([Type] $AParam)

在 C# 中使用泛型,代码可能类似于:

public static class Test
{
    public static T? TestType<T>()
    {
        Type type = typeof(T);
        object? result = type switch
        {
            _ when type == typeof(bool) => true,
            _ when type == typeof(int) => 2,
            _ when type == typeof(string) => "Miep",
            _ => null
        };

        Console.WriteLine(
            $"You provided the type  : '{result?.GetType().Name ?? "Invalid!"}'");

        return (T?)result;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.