首页 > 解决方案 > 如何使用脚本从类中获取重载定义?

问题描述

如何使用脚本从类中获取重载定义?

我已经通过命令行尝试过,它可以工作。

Assembly=[appdomain]::currentdomain.GetAssemblies() | Where-Object Location -match 'FileNet.API'
$Class=$Assembly.GetModules().gettypes()
$Constructors=$Class.GetMembers()| where-object {$_.IsConstructor -eq $True}| where-object {$_.IsPublic-eq $True}


foreach ($constructor in $Constructors) {
    $myconstructor=$constructor.DeclaringType.ToString()
        [type]$mytype=$constructor.DeclaringType
        "========================================="
        $myconstructor
        "========================================="
        $Members=($mytype.DeclaredMembers).Name
        foreach ($Member in $Members) {
            $mytype::$Member.OverloadDefinition
    }
}

但是,这在命令行上有效


$mytype::FetchInstance.OverloadDefinitions
static FileNet.Api.Core.IDomain FetchInstance(FileNet.Api.Core.IConnection conn, string name, FileNet.Api.Property.PropertyFilter filter)

标签: .netpowershell

解决方案


::运算符仅适用于公共静态方法。

如果您想要一个类型的所有构造函数和方法定义,请考虑挂钩到DotNetAdapter在后台生成这些重载定义的类型:

function Get-MethodOverload
{
    param(
        [Parameter(Mandatory = $true)]
        [type]$Type
    )

    # Obtain a reference to the DotNetAdapter class
    $NetAdapter = [psobject].Assembly.GetType('System.Management.Automation.DotNetAdapter')
    # Obtain a reference to the GetMethodInfoOverloadDefinition method
    $OverloadResolver = $NetAdapter.GetMethod('GetMethodInfoOverloadDefinition',[System.Reflection.BindingFlags]'Static,NonPublic')

    # start with constructors
    foreach($ctor in $Type.GetConstructors())
    {
        $OverloadResolver.Invoke($null,@($ctor.Name,[System.Reflection.MethodBase]$ctor,0))        
    }

    # then methods
    foreach($method in $Type.GetMethods())
    {
        $OverloadResolver.Invoke($null,@($method.Name,[System.Reflection.MethodBase]$method,0))
    }
}

现在您可以将自定义类传递给函数,它会返回重载定义:

$Assembly = [appdomain]::CurrentDomain.GetAssemblies() | Where-Object Location -match 'FileNet.API'
$Class = $Assembly.GetTypes() | Where-Object Name -eq 'MyClass'
Get-MethodOverload -Type $Class

推荐阅读