Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Selezionare il valore di un Enum via Reflection

    Salve,

    mi servirebbe di capire come caricare il field di un object cn un determinato valore di un Enum. mentre per le classi, estendendo object, c'è il pratico getType che ti fa accedere a tutti gli aspetti della classe, non riesco a capire come poter fare lo stesso con un enum. In sostanza, data una stringa, dovrei inizializzare il campo di un object col valore dell'enum corrispondente a quella stringa.

    grazie a tutti
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  2. #2
    Non so se le enum sono soggette alla reflection, sinceramente non ho mai provato, ma alla fin fine puoi usare 2 comode soluzioni per evitare di scomodare la reflection (che sarebbe abbastanza esosa):
    - la prima è un bello switch con una sfilza di case, soluzione fattibile se il numero di enum è contenuto
    - la seconda è una hashtable, ovvero un dictionary generic dove metti come primo campo la stringa e come secondo il valore dell'enum ... in modo che vai a riempire l'hashtable e via

    Dipende poi da cosa devi fare, ti conviene usare la seconda soluzione in ogni caso nel senso che se non vuoi compilare l'hashtable manualmente lo fai tramite reflection ... in modo che lo hai sempre compilato e non lo devi fare ogni volta
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  3. #3
    la prossima volta che proponi uno switch, chiederò di licenziarti da moderatore

    scherzi a parte, boh l'hashtable potrebbe essere una strada, però diventerebbe collo di bottiglia per uno sviluppo ulteriore dell'applicazione. L'articolo piu interessante che ho trovato finora a riguardo è questo http://www.distribucon.com/blog/Gett...eflection.aspx ma non so se possa fare a caso mio.

    cmq grazie intanto non sono l'unico nottambulo che pensa al .net nel cuore della notte
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  4. #4
    Originariamente inviato da Santino83_02
    la prossima volta che proponi uno switch, chiederò di licenziarti da moderatore

    scherzi a parte, boh l'hashtable potrebbe essere una strada, però diventerebbe collo di bottiglia per uno sviluppo ulteriore dell'applicazione. L'articolo piu interessante che ho trovato finora a riguardo è questo http://www.distribucon.com/blog/Gett...eflection.aspx ma non so se possa fare a caso mio.

    cmq grazie intanto non sono l'unico nottambulo che pensa al .net nel cuore della notte


    beh, dai, lo switch se hai pochi valori nell'enum è la soluzione migliore perché tu scrivi il codice ma il compilatore jit decide come ottimizzarlo

    Ovviamente se ti ritrovi con un enum che già supera i 10/15 switch il codice diventerebbe ingestibile

    Alternativamente potresti cestinare in blocco l'enum e usi solo una hashtable con dentro tutte cose (secondo me è la soluzione migliore) cosi continui a tenere del codice leggibile, pulito e soprattutto non ti mangi nessuna futura espansione perché nessuno ti impedisce di aggiungere altri valori all'hash table
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  5. #5
    Originariamente inviato da Santino83_02
    ... L'articolo piu interessante che ho trovato finora a riguardo è questo http://www.distribucon.com/blog/Gett...eflection.aspx ma non so se possa fare a caso mio.
    ho dato un occhiata all'articolo, ok ... il metodo GetFields fa esattamente quello che ti serve

    Li estrai, specificando nelle bindings, come dice lui, di estrarre solo i valori pubblici e quelli statici, dopo di che devi usare la propietà .Name (sempre esattamente come fa lui )

    in pratica se ti metti quello sprazo di codice all'inizio puoi utilizzare una hashtable per mettere in cache enum/stringhe e poi dopo utilizzare la hashtable come riferimento ... altrimenti, ogni volta, dovresti usare la reflection
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  6. #6

    Re: Selezionare il valore di un Enum via Reflection

    Originariamente inviato da Santino83_02
    Salve,
    ......
    In sostanza, data una stringa, dovrei inizializzare il campo di un object col valore dell'enum corrispondente a quella stringa.

    grazie a tutti
    Ciao Santino,

    vedi se può andare

    codice:
    Imports System
    
    Module Module1
    
        Enum Colors
            Red = 1
            Green = 2
            Blue = 4
            Yellow = 8
        End Enum 'Colors
    
        Sub Main()
            Dim sName As String = "Green"
            Console.WriteLine()
    
            Console.WriteLine("Il valore di {0} è {1}", sName, CType([Enum].Parse(GetType(Colors), sName), Integer)))
    
        End Sub 'Main
    
    
    End Module

  7. #7
    grazie ad entrambi ho risolto:

    codice:
    Type enumType = typeof(DbType);
    string enumName="Int32";
    ...
    
    mioTipo = (DbType)Enum.Parse(enumType,enumName);
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.