我正在尝试在类中构建一个方法,该方法接受所需的返回类型作为参数。 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 执行此操作,因为我刚刚重新设计了整个库以使用类而不是单独函数的集合。
由 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;
}
}