设置:在Windows 10 / PS 5.1上运行此命令以访问我正在使用的WindowsRuntime和WinRT类型:
Add-Type -AssemblyName System.Runtime.WindowsRuntime
[Windows.Foundation.IAsyncAction,Windows.Foundation,ContentType=WindowsRuntime]
[Windows.Foundation.IAsyncOperation`1,Windows.Foundation,ContentType=WindowsRuntime]
[Windows.Foundation.IAsyncOperationWithProgress`2,Windows.Foundation,ContentType=WindowsRuntime]
好的,现在找到一个我不想要的扩展方法 - AsTask()
,它接受一个参数,输入为[IAsyncAction]
:
[System.WindowsRuntimeSystemExtensions].GetMethod('AsTask',
[Windows.Foundation.IAsyncAction])
会有一些输出 - 找到一个方法。
现在尝试我正在寻找的那个,相同的AsTask()
方法,但这次重载采用参数类型IAsyncOperation<T>
或[IAsyncOperation`1]:
[System.WindowsRuntimeSystemExtensions].GetMethod('AsTask',
[Windows.Foundation.IAsyncOperation`1])
没有输出。如果类型名称以字符串形式给出,则无输出。
但这种超载确实存在;询问所有方法并在之后过滤它们,这将找到它:
([System.WindowsRuntimeSystemExtensions].GetMethods() |
Where-Object { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and
$_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]
最后一段代码就是我正在使用它并且它有效,这里引出我的问题是:我可以在一次调用中直接从GetMethod()请求该方法吗?
即使它们具有相同的类型GUID,通用“AsTask”方法和[Windows.Foundation.IAsyncOperation`1]中的类型也不相同。它们在4个参数中有所不同,但它们是只读的:
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$methods = [System.WindowsRuntimeSystemExtensions].GetMethods()
$taskList = $methods | ?{$_.Name -eq "AsTask"}
$asTask = $taskList | ?{$_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' }
$type1 = $asTask.GetParameters().ParameterType
$type2 = [Windows.Foundation.IAsyncOperation`1]
$attribList = ("IsGenericTypeDefinition", "IsConstructedGenericType", "GenericTypeParameters", "GenericTypeArguments")
foreach ($attrib in $attribList) {
"$attrib : $($type1.$attrib) -> $($type2.$attrib)"
}