2010-06-01 17 views
7

¿Es posible hacer una enumeración usando solo números en C#? En mi programa, tengo una variable, Ganancia, que solo se puede configurar en 1, 2, 4 y 8. Estoy usando un control de cuadrícula para mostrar y establecer este valor. Si tuviera que crear una enumeración como esto ...¿Cómo puedo crear una enumeración usando números?

private enum GainValues {One, Two, Four, Eight} 

y hice mi ganancia variable de tipo GainValues ​​entonces la lista desplegable en el PropertyGrid solo mostraría los valores disponibles para la variable de ganancia. El problema es que quiero que los valores de ganancia se lean numéricamente y no como palabras. Pero no puedo crear una enumeración como esta:

private enum GainValues {1,2,4,8} 

¿Hay otra forma de hacerlo? Tal vez creando un tipo personalizado?

Respuesta

15

No es así como funciona enums. Una enumeración le permite nombrar un valor específico para que pueda referirse a él en su código de manera más sensata.

Si desea limitar el dominio del número válido, las enumeraciones pueden no ser la elección correcta. Una alternativa, es simplemente crear una colección de valores válidos que se puede utilizar como ganancias:

private int[] ValidGainValues = new []{ 1, 2, 4, 8}; 

Si desea hacer esto más typesafe, incluso se podría crear un tipo personalizado con un constructor privado, defina todos los valores válidos como instancias públicas estáticas y luego exhíbalos de esa manera. Pero aún tendrá que dar un nombre a cada valor válido, ya que en C# los nombres de miembro/variable no pueden comenzar con un número (aunque pueden contenerlos).

Ahora bien, si lo que realmente quiere, es asignar valores específicos a las entradas de una enumeración GainValues, que se pueden hacer:

private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 }; 
+0

Probablemente quiera hacer esto de forma estática de solo lectura, y tal vez interna o pública dependiendo de los requisitos del alcance, pero sí, esta es la mejor solución. –

+0

@Cylon Cat: Sí, es un buen punto acerca de la estática/solo lectura, aunque en la práctica, necesitarías que fuera una colección como List en lugar de una matriz para imponer la inmutabilidad. – LBushkin

4
private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 } 

debería funcionar.

Actualización: OK, creo que te he entendido mal allí.

Quizás podría usar un KeyValuePair<string, int> y luego unir el nombre y el valor a la propiedad Clave y Valor, respectivamente.

+0

No está claro que esto es lo que el OP está buscando. Parece más como si quisiera usar los valores numéricos literales como los * nombres * de los miembros de la enumeración, lo que es ilegal. – LBushkin

+0

@LBushkin: dada la descripción, es _probably_ lo que quiere el OP. –

+0

@Henk: No estoy tan seguro, el OP escribe: 'El problema es que quiero que los valores de ganancia se lean numéricamente y no como palabras. Mi interpretación es que el OP quiere una lista limitada de valores válidos para ganancias, en lugar de una enumeración nombrada. – LBushkin

0

uso asignación de valores explícitos en la enumeración:

private enum GainValues 
{ 
    One = 1, 
    Two = 2, 
    Four = 4, 
    Eight = 8 
} 

continuación a enumerar a través de estos valores, haga lo siguiente:

GainValues currentVal; 

foreach(currentVal in Enum.GetValues(typeof(GainValues)) 
{ 
    // add to combo box (or whatever) here 
} 

Entonces usted puede echar a/de enteros como sea necesario:

int valueFromDB = 4; 

GainValues enumVal = (GainValues) valueFromDB; 

// enumVal should be 'Four' now 
0

Por desgracia, los símbolos en C# puede contener números, pero no puede inicio con números. Entonces vas a tener que usar palabras.

Alternativamente, se podría hacer Gain1, Gan 2, etc.

O bien, podría renunciar a una enumeración por completo y usar constantes y procesamiento interno.

0

Puede usar una lista personalizada como fuente de datos para su lista desplegable.

código subyacente:

using GainItem = KeyValuePair<string, int>; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      List<GainItem> dic = new List<GainItem>(); 
      dic.Add(new GainItem("First", 1)); 
      dic.Add(new GainItem("Second", 2)); 
      dic.Add(new GainItem("Fourth", 4)); 
      ddl.DataSource = dic; 
      ddl.DataBind(); 
     } 


    } 

    protected void btn_Click(object sender, EventArgs e) 
    { 
     Response.Write(ddl.SelectedValue); 
    } 
} 

página ASP:

<div> 
    <asp:DropDownList runat="server" ID="ddl" DataValueField="Value" DataTextField="Key" /> 
    <asp:Button ID="btn" runat="server" OnClick="btn_Click" /> 
    </div> 

Además, puede hacer que la enumeración para establecer el valor por defecto, ...

esperanza esto ayuda

5

Si entendí correctamente la pregunta original, la respuesta puede ser la siguiente:

, usted puede obtener los números que figuran en una enumeración en el inspector por el simple uso de un prefijo de subrayado, por ejemplo:

public enum MyNumbers{ _1, _2, _3, _4 }; 
public MyNumbers myNumbers; 

Hope esto es ayuda!

10

Ya ha habido una buena cantidad de respuestas, sin embargo, ofreceré otra solución. Si desea que su control muestre un número real en lugar de la palabra en inglés para el número bajo su control, puede usar anotaciones de datos.

using System.ComponentModel.DataAnnotations; 

private enum GainValues 
{ 
[Display(Name = "1")] 
One, 
[Display(Name = "2")] 
Two, 
[Display(Name = "4")] 
Four, 
[Display(Name = "8")] 
Eight 
} 

Esto es útil en cualquier lugar de su programa en el que desee utilizar un nombre descriptivo en lugar del nombre real de un miembro.

Cuestiones relacionadas