Powershell / .net反射 - GetMethod()找到一个普通方法,但不是通用方法 - 为什么?

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

设置:在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()请求该方法吗?

powershell reflection
1个回答
1
投票

即使它们具有相同的类型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)"
}
© www.soinside.com 2019 - 2024. All rights reserved.