Question Comment créer un type Enum dynamiquement ?

Plus d'informations
il y a 2 ans 9 mois #30960 par Arnaud Petitjean
Le Dynamic ValidatedSet est intéressant (je ne connaissais pas, merci Laurent !), mais je trouve plus propre le fait d'utiliser un type Enum.

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 9 mois #30965 par Laurent Dardenne
On est assuré avec une Enum de créer une propriété de classe qui est typée.
Je me suis souvenu que l'attribut Validatescript() ne fonctionne pas sur un membre de classe (en v5 en tous cas)...

Sinon une autre solution, l'astuce de Thomas est à noter, mais je préfère ce type de code :
#Le module :
class MyClass
{
    #todo https://github.com/PowerShell/PSScriptAnalyzer/issues/1584
    [Service]$MyEnum
    MyClass ()
    {
        # $this.addEnum([String]$Name, [Array]$values)
    }
}

function New-myClass {
    param (
        [Service] $MyEnum
    )
    [MyClass]$PsBoundParameters
}
L’appel:
function Add-MyEnum
{
    <#
        .DESCRIPTION
        Créé un enum.
    #>
    param
    (
        [String]$Name,
        [String[]] $values
    )
    $Ofs=",`r`n"
    Add-Type -TypeDefinition "
        public enum $Name
        {
            $values
        }
    "
}

$T=@('Wsus', 'winserv')

# Ajout d'une nouvelle énumération
Add-MyEnum -Name Service -values $T

# Import d'une classe
Import-module $PsScriptRoot\Myclass.psm1 -force

# Création d'une instance.
$test =  New-myClass -MyEnum  'Wsus'
$Test
Cela permet, certes en plus verbeux, d'exporter ou non des classes.L'instruction Using dans l'exemple cité exporte toutes les classes il me semble, je pense que selon les cas les deux constructions se complètent.
L'instruction Using s'appuie bien sur $env:PsModulePath

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 9 mois #30977 par ericlm128
Bonjour,

N'ayant pas votre niveau je reviens sur le besoin (hors sujet ?)

Un type enum est définit pas le =11.0ptdéveloppeur et si il n'est pas aisé de le créer dynamiquement c'est que les valeurs doivent être connu et maitriser par ce dernier.
A mon sens, le type enum doit être utilisé par le développeur pour simplifier son codage en proposant une correspondance (texte, numériques intégraux) et n'est pas destiné à un usage en provenance de données externe.
Une création par des biais détournés n'est elle par contre nature au concept de ce type ?

Si tu connais les valeurs de ton énumération autant la créer directement de façon naturel.

Si les valeurs sont inconnus tu t'expose à des exceptions que tu devra gérer.
Pour des données externes est ce qu'un simple dictionnaire <string, int> n'est pas plus adapté ?
 

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 9 mois - il y a 2 ans 9 mois #30978 par ericlm128
Voir aussi : docs.microsoft.com/fr-fr/dotnet/standard/design-guidelines/enum

N’utilisez pas d’énumération pour les jeux ouverts (tels que la version du système d’exploitation, les noms de vos amis, etc.).

N’étendez pas System.Enum directement.
System.Enum est un type spécial utilisé par le CLR pour créer des énumérations définies par l’utilisateur. La plupart des langages de programmation fournissent un élément de programmation qui vous permet d’accéder à cette fonctionnalité. Par exemple, en C#, le enum mot clé est utilisé pour définir une énumération.
Dernière édition: il y a 2 ans 9 mois par ericlm128.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 9 mois #30979 par Laurent Dardenne
Bonjour Eric,
>>N'ayant pas votre niveau
Ce n'est pas une question de niveau, de connaissance à la rigueur.

>>je reviens sur le besoin
Le mieux placé étant Arnaud je le laisserais répondre.

>>s'il n'est pas aisé de le créer dynamiquement c'est que les valeurs doivent être connu et maitriser par ce dernier.
Oui pour un langage compilé, ici comme PS propose le dynamisme on cherche souvent une solution l'utilisant.

>>A mon sens, le type enum doit être utilisé par le développeur pour simplifier son codage en proposant une correspondance (texte, numériques intégraux) et n'est pas destiné à un usage en provenance de données externe.
Oui c'est vrai.

>>Une création par des biais détournés n'est elle par contre nature au concept de ce type ?
Si le système de reflection de .Net le permet c'est que les concepteurs du framework on pensé à qq scénarios ( si on ne peut pas codere autrement)
Effectivement ici c'est un détournement, disons une facilité de codage, tant que les valeurs de l'enum ne change pas pendant l'exécution du code ça ne me choque pas.

>>Pour des données externes est ce qu'un simple dictionnaire <string, int> n'est pas plus adapté ?
Peut être, c'est une liste de valeurs autorisées, l'objectif il me semble était de ne pas coder le contrôle de celles-ci.

Si on regarde l'évolution de l'attribut ValidateScript c'est un bon exemple de ce type de contrôle.
Dans le lien que tu cites le pb potentiel (en fin d'atyicle) est l'évolution des valeurs.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 9 mois - il y a 2 ans 9 mois #30980 par Laurent Dardenne
Un oubli,pour ceci :
>>N’étendez pas System.Enum directement.
L'article parle de la classe,de ne pas la dériver :
Class MyEnum:System.Enum

Tutoriels PowerShell
Dernière édition: il y a 2 ans 9 mois par Laurent Dardenne.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.255 secondes
Propulsé par Kunena