none
Passar valores de uma Array para uma Enum RRS feed

  • Pergunta







  • ArrayList admins = new ArrayList(); foreach (User user in userRole.Users) { admins.Add(user.UserName); _tecnico = user.UserName; }
    Bom dia pessoal,
    parece que meus pipinos é diferente dos de todo mundo, mas nesses momentos conto com vocês que conhecem muito mais do que eu.

    Dessa vez eu queria passar ler um array e passar os valores para uma Enum, alguém sabe como fazer? ou uma forma semelhande de obter o mesmo resultado.
    terça-feira, 27 de outubro de 2009 13:21

Respostas

  • Pronto, tá aí o que vc precisa:

            private void btnCreateEnum_Click( object sender , EventArgs e )
    {

    AppDomain domain = Thread.GetDomain();
    AssemblyName name = new AssemblyName();
    name.Name = "EnumAssembly";
    AssemblyBuilder asmBuilder = domain.DefineDynamicAssembly(
    name , AssemblyBuilderAccess.Run );
    ModuleBuilder modBuilder =
    asmBuilder.DefineDynamicModule( "EnumModule" );
    EnumBuilder enumBuilder = modBuilder.DefineEnum( "Language" ,
    TypeAttributes.Public ,
    typeof( System.Int32 ) );

    // Este aqui deve ser o array com os valores que vc buscou da base
    // Segue um exemplo:
    string[] array = { "en-US" , "en-UK" , "ar-SA" , "da-DK" , "French" , "Cantonese" };
    for( int i = 0 ; i < array.Length ; i++ )
    {
    enumBuilder.DefineLiteral( array[i].ToString() , i );
    }

    Type enumType = enumBuilder.CreateType();
    Enum enumObj = (Enum) Activator.CreateInstance( enumType );

    // Aqui segue um exemplo do que fazer com os campos resultantes, no caso estou exibindo o nome na tela.
    try
    {
    FieldInfo[] fields = enumType.GetFields();
    for( int i = 0 ; i < fields.Length ; i++ )
    {
    Console.WriteLine( fields[i].Name );
    }

    }
    catch( Exception ex )
    {
    Console.WriteLine( "Exception: {0}" , ex.Message );
    }
    }

    Pero, já vou avisando, isso não é uma boa prática. Se eu conhecesse melhor esse XFA até te ajudaria melhor, mas como nunca mexi com ele, essa é a resposta pra sua pergunta, especificamente.

    Att.

    Vinicius de Sá
    quinta-feira, 29 de outubro de 2009 19:03

Todas as Respostas

  • Não entendi o contexto do seu problema. Mas nunca tentei passar valores de um array para uma enum, eu só uso as enums pra definir valores em hardcode (em tempo de compilação).
    Já diz o MSDN que "o enum é um tipo distinto constituído por um conjunto de constantes nomeadas...", ou seja, seu objetivo não é esse.

    Falow
    quarta-feira, 28 de outubro de 2009 18:12
  • Eu estou programando com o XAF da Devexpress, ele tem ums tipos nativos da DevExpress o qual não aceita as coversões padrão do C#, eu preciso exibir em um combobox apenas a lista o campo que contenha o nome de usuário, na verdade eu faço a varredura em em uma classe nativa no XAF pego todos os usuários que sejam administradores.

    Eu consigo com o código acima exibir apenas o primeiro usuário, mas não pode ser assim, o XAF cria os campos de acordo  com o tipo de dados exibidos.

    Quando eu faço a varredura na coleção XPCollection<User> de usuários ele me retorna uma lista com todos os campos da tabels usuários, mas não monta o combobox.

    Como eu consigo o o Arraylist morstrar só um resultado, eum pensei em fazer uma Enum, passar todos os usuários encontrados após varrer o Arraylist e colocar esse resultado na ENUM, porque se meu tipo de dados for uma Enum o XAF cria o combobox para mostrar os resultados.

    quinta-feira, 29 de outubro de 2009 10:52
  • O combobox do XAF trabalha somente com enums? Não tem como vc adicionar os itens um a um, ou então passar uma IList pra ele?

    Falow
    quinta-feira, 29 de outubro de 2009 17:52
  • ELe trabalha com critérios e relacionamento de tabelas há outras formas de fazer isso, mas o problem é que quero trazer do bando campos já relacionados, eu verifico em uma tabela a ocorrencia de um administrador vinculado a uma regra, e trago todos os usuários que tem como regra a de nome administrador, dessa forma fica maiscomplicado vc entender.

    Eu só precisava mesmo saber se alguém já passou dados de um array para uma ENUM, eu não vi nada relacionado, mas pode ser uma carta na manga que elguém use, não sei...

    Se isso for possivel já quebra um galhão se não for, vou continuar tentando no forum da Devexpress, alguém pode ter feito isso de outra maneira.

    Mas obrigado pela atenção...
    quinta-feira, 29 de outubro de 2009 18:24
  • Pronto, tá aí o que vc precisa:

            private void btnCreateEnum_Click( object sender , EventArgs e )
    {

    AppDomain domain = Thread.GetDomain();
    AssemblyName name = new AssemblyName();
    name.Name = "EnumAssembly";
    AssemblyBuilder asmBuilder = domain.DefineDynamicAssembly(
    name , AssemblyBuilderAccess.Run );
    ModuleBuilder modBuilder =
    asmBuilder.DefineDynamicModule( "EnumModule" );
    EnumBuilder enumBuilder = modBuilder.DefineEnum( "Language" ,
    TypeAttributes.Public ,
    typeof( System.Int32 ) );

    // Este aqui deve ser o array com os valores que vc buscou da base
    // Segue um exemplo:
    string[] array = { "en-US" , "en-UK" , "ar-SA" , "da-DK" , "French" , "Cantonese" };
    for( int i = 0 ; i < array.Length ; i++ )
    {
    enumBuilder.DefineLiteral( array[i].ToString() , i );
    }

    Type enumType = enumBuilder.CreateType();
    Enum enumObj = (Enum) Activator.CreateInstance( enumType );

    // Aqui segue um exemplo do que fazer com os campos resultantes, no caso estou exibindo o nome na tela.
    try
    {
    FieldInfo[] fields = enumType.GetFields();
    for( int i = 0 ; i < fields.Length ; i++ )
    {
    Console.WriteLine( fields[i].Name );
    }

    }
    catch( Exception ex )
    {
    Console.WriteLine( "Exception: {0}" , ex.Message );
    }
    }

    Pero, já vou avisando, isso não é uma boa prática. Se eu conhecesse melhor esse XFA até te ajudaria melhor, mas como nunca mexi com ele, essa é a resposta pra sua pergunta, especificamente.

    Att.

    Vinicius de Sá
    quinta-feira, 29 de outubro de 2009 19:03
  • Valeu Vinicius vou testar e depois posto o resultado aqui,
    quinta-feira, 29 de outubro de 2009 19:38
  • Vinicius testei aqui com outra aplicação funcionou legal, quanto a aplicação com XAF eu queria tirar uma duvida com você, não relacionado ao XAF mas a esse código,

    Normalmente no XAF  eu crio uma enum tipo

    Public Enum Nomes
    {
    Fulano,
    Cicrano,
    Beltrano
    }

    O nome do meu campo seria:

    Public Nomes Users
    {
    get
    }

    Nesse caso como seria o nome do meu campo, no caso como seria o meu "Nomes"?
    sexta-feira, 30 de outubro de 2009 11:35
  • Não entendi direto, mas vc pode dar o nome que quiser, até "Nomes" serviria, mas lembre-se que ficar repetindo nome de propriedade com nome de enum e etc pode tornar tudo confuso depois...

    Caso vc tenha dúvidas com nomeação de objetos/classes/propriedades/etc. acesse: http://msdn.microsoft.com/en-us/library/xzf533w0%28VS.71%29.aspx ou http://msdn.microsoft.com/en-us/library/ms229045.aspx

    Att.

    Vinicius de Sá
    Se a resposta foi útil, não esqueça de marcá-la. _________________________________________________________ "Nada é tão ruim que não possa piorar" diz o filósofo....."Tava funcionando lá em casa..." diz o programador.
    sexta-feira, 30 de outubro de 2009 16:21
  • A forma de nominar eu entendo, não entendi onde fica o nome da Enum no código.
    Enum enumObj = (Enum)Activator.CreateInstance(enumType); Enum enumObj = (Enum)Activator.CreateInstance(enumType);
    Eu lendo o código acredito que seja enumObj o nome, mas nesse código não há referências a esse esse nome.

    sexta-feira, 30 de outubro de 2009 17:17
  • AA tá entendi heheheh
    O nome dele é definido na seguinte linha:

    EnumBuilder enumBuilder = modBuilder.DefineEnum( "Language"
     , TypeAttributes.Public , typeof
    ( System.Int32 ) );
    Para maiores referências sobre o método DefineEnum, acesse a página:
    http://msdn.microsoft.com/en-us/library/system.reflection.emit.modulebuilder.defineenum.aspx

    O enumObj é a instância do enum, vide as linhas:
    Type enumType = enumBuilder.CreateType();
    Enum enumObj = (Enum) Activator.CreateInstance( enumType );

    É nessa hora que ele cria a instância do enum.
    Os valores dele são definidos aqui:
    string
    [] array = { "en-US"
     , "en-UK"
     , "ar-SA"
     , "da-DK"
     , "French"
     , "Cantonese"
     };
    for ( int i = 0 ; i < array.Length ; i++ )
    {
    enumBuilder.DefineLiteral( array[i].ToString() , i );
    }

    Falou

    Se a resposta foi útil, não esqueça de marcá-la. _________________________________________________________ "Nada é tão ruim que não possa piorar" diz o filósofo....."Tava funcionando lá em casa..." diz o programador.
    sexta-feira, 30 de outubro de 2009 21:27