powershell 如何为枚举创建转换器

f45qwnt8  于 2023-06-06  发布在  Shell
关注(0)|答案(1)|浏览(384)

如何为自定义PowerShell [enum]创建(最好在PowerShell中)类型转换器?
PowerShell相关问题:enum <enum-name> should ConvertFrom [string]
基于[Access]的具体示例How to define a type of a bit-combination?

[Flags()] enum Access {
    Execute = 1
    Write = 2
    Read = 4
}

我正在尝试构建一个[Access]ConvertFrom转换器:

class AccessConverter : System.Management.Automation.PSTypeConverter
{
    [bool] CanConvertFrom([object]$sourceValue, [Type]$destinationType) {
        return $sourceValue -eq [string]
    }
    [object] ConvertFrom([object]$sourceValue, [Type]$destinationType, [IFormatProvider]$formatProvider, [bool]$ignoreCase) {
        if     ($sourceValue -eq [string]) { return [Access]$SourceValue }
        else { throw [NotImplementedException]::new() }
    }
    [bool] CanConvertTo([object]$sourceValue, [Type]$destinationType) {
        return $false
    }
    [object] ConvertTo([object]$sourceValue, [Type]$destinationType, [IFormatProvider]$formatProvider, [bool]$ignoreCase) {
        throw [NotImplementedException]::new() 
    }
}

Update-TypeData -TypeName Access -TypeConverter AccessConverter

但这并不像预期的那样工作:

$Access.HasFlag('read, write')

方法异常:无法转换参数“flag”,其值为:“read,write”,对于“HasFlag”键入“System.Enum”:无法将值“read,write”转换为类型“System.enum”。错误:“无法对ContainsGenericParameters为true的类型或方法执行后期绑定操作。"”
或者是因为HasFlag期望的是一个通用的enumType类型,而不是特定的自定义(“access“)enum

9jyewag0

9jyewag01#

不确定这是否适用于PSTypeConverter,或者它是否与之相关,在我看来,你想要完成的事情可以通过使用一个类型转换的脚本方法覆盖enum中的.HasFlag方法来实现:

[Flags()] enum Access {
    Execute = 1
    Write = 2
    Read = 4
}

$updateTypeDataSplat = @{
    TypeName   = 'Access'
    MemberType = 'ScriptMethod'
    MemberName = 'HasFlag'
    Value      = {
        param([Access] $flag)

        $this.PSBase.HasFlag($flag)
    }
}

Update-TypeData @updateTypeDataSplat

$access = [Access] 'Execute, Read'
$access.HasFlag('Execute, Read')         # true
$access.HasFlag('Execute, Write, Read')  # false

相关问题