如何发送和接收枚举参数?

时间:2014-09-26 16:37:26

标签: c# dynamic enums

如何发送和接收枚举参数? 我有几个类型枚举,我想制作一个通用方法来获取描述

 public enum Lista_Size
 {
   [Description("Chica")] Chica,
   [Description("Grande")] Grande,
   [Description("Extra Grande")] Extra_Grande,
 }

 public enum Lista_Color
 {
   [Description("Verde")] Verde,
   [Description("Blanco Perla")] Blanco,
   [Description("Rojo Fuerte")] Rojo_Strong,
 }

我有这种方法来获取描述

    private static IEnumerable<string> Descripcion_Referencia(Enum Referencia)
    {
        var Descripcion = new List<string>();
        var Tipo = Referencia.GetType();
        var Nombre = Enum.GetName(Tipo, Referencia);
        var Campo = Tipo.GetField(Nombre);
        var Campo_Descripcion = Campo.GetCustomAttributes(typeof(DescriptionAttribute), true);
        foreach(DescriptionAttribute Atributo in Campo_Descripcion)
        {
            //MessageBox.Show("Atributo.Description: " + Atributo.Description);
            Descripcion.Add(Atributo.Description);
        }
        return Descripcion;
    }

我还有另外两个调用de方法Descripcion_Referencia的方法,这个方法我想让它变得通用。我想把它称之为:Cargar_Combo(Lista_Color);或Cargar_Combo(Lista_Size) 但如果我写公共虚空Cargar_Combo(枚举Lista)它表示错误¿我如何发送或接收它?

    public void Cargar_Combo()
    {
        DataTable Dt_Combo = new DataTable();
        Dt_Combo.Columns.Add("Value");
        Dt_Combo.Columns.Add("Descripcion");
        DataRow Dr_Combo = Dt_Combo.NewRow();
        IEnumerable<string> Resultado;

        Type Tipo = typeof(Gral_Constantes.Cat_Uti_Formatos_Apartados.Referencia_Catalogo_Sistema);
        String[] Lista = Tipo.GetEnumNames();

        for (int i = 0; i < Lista.Length; i++ )
        {
            Resultado = Descripcion_Referencia((Gral_Constantes.Cat_Uti_Formatos_Apartados.Referencia_Catalogo_Sistema)Enum.Parse(typeof(Gral_Constantes.Cat_Uti_Formatos_Apartados.Referencia_Catalogo_Sistema), Lista[i]));
            Dr_Combo = Dt_Combo.NewRow();
            Dr_Combo["Value"] = Lista[i];
            Dr_Combo["Descripcion"] = Resultado.ElementAt(0);
            Dt_Combo.Rows.Add(Dr_Combo);

        }
        Cmb_Catalogo.DataSource = Dt_Combo;
        Cmb_Catalogo.DisplayMember = "Descripcion";
        Cmb_Catalogo.ValueMember = "Value";

    }

好的。我用Enum Type parameterName做了它,但是现在Type = typeof(参数)无法识别参数的名称并用红色加下划线。

    public DataTable Cargar_Combo(Enum Parametro)
    {
        DataTable Dt_Referencia = new DataTable();
        Dt_Referencia.Columns.Add("Nombre");
        Dt_Referencia.Columns.Add("Descripcion");
        DataRow Dr_Referencia = Dt_Referencia.NewRow();
        IEnumerable<string> Resultado;


        Type Tipo = typeof(Parametro); //Here error mark , does not recognize the name of the parameter
        String[] Lista = Tipo.GetEnumNames();

        for (int i = 0; i < Lista.Length; i++)
        {

            Resultado = Descripcion_Referencia((Parametro)Enum.Parse(typeof(Parametro), Lista[i]));

            Dr_Referencia = Dt_Referencia.NewRow();
            Dr_Referencia["Value"] = Lista[i];
            Dr_Referencia["Descripcion"] = Resultado.ElementAt(0);
            Dt_Referencia.Rows.Add(Dr_Referencia);

        }
    }

非常感谢你的帮助。我提供了最后一段代码,希望我已经适当地实施,及时服务,但我有另一个问题。

我有另一种方法来描述枚举值,发送表单的时间不接受enum修复使用的转换。

  //Add this line<Parametro_Referencia>() where Parametro...
 public DataTable Carga_Referencias<Parametro_Referencia>() where Parametro_Referencia : struct, IConvertible 
    {
        DataTable Dt_Referencia = new DataTable();
        Dt_Referencia.Columns.Add("Nombre");
        Dt_Referencia.Columns.Add("Descripcion");
        DataRow Dr_Referencia = Dt_Referencia.NewRow();
        IEnumerable<string> Resultado;


        Type Tipo = typeof(Parametro_Referencia); //Here error mark , does not recognize the name of the parameter
        String[] Lista = Tipo.GetEnumNames();

        for (int i = 0; i < Lista.Length; i++)
        {


            Resultado = Descripcion_Referencia((Parametro_Referencia)Enum.Parse(typeof(Parametro_Referencia), Lista[i]));


            Dr_Referencia = Dt_Referencia.NewRow();
            Dr_Referencia["Value"] = Lista[i];
            Dr_Referencia["Descripcion"] = Resultado.ElementAt(0);
            Dt_Referencia.Rows.Add(Dr_Referencia);

        }

行Resultado = Descripcion_Referencia((Parametro_Referencia)Enum.Parse(typeof(Parametro_Referencia),Lista [i]))我遇到了问题。不会重新认识这种转换。

获得描述的metoho是。

    private static IEnumerable<string> Descripcion_Referencia(Enum Referencia)
    {
        var Descripcion = new List<string>();
        var Tipo = Referencia.GetType();
        var Nombre = Enum.GetName(Tipo, Referencia);
        var Campo = Tipo.GetField(Nombre);
        var Campo_Descripcion = Campo.GetCustomAttributes(typeof(DescriptionAttribute), true);
        foreach (DescriptionAttribute Atributo in Campo_Descripcion)
        {
            Descripcion.Add(Atributo.Description);
        }
        return Descripcion;
    }
        return Dt_Referencia;
    }

您会知道如何转换或更正运费吗?

1 个答案:

答案 0 :(得分:0)

枚举在C#中很奇怪 - 它们是类型,类型,而且C#不允许你将类型作为参数传递。我之前写了一些东西将枚举转换为字典;也许这个例子将有助于向您展示如何处理枚举参数。我花了一段时间才弄清楚自己:)

public class EnumConverter
{
    public static Dictionary<string, int> EnumToDict<TEnum>() where TEnum : struct, IConvertible
    {
        Type enumType = typeof (TEnum);
        if (!enumType.IsEnum)
            throw new ArgumentException("T must be an enum.");
        return Enum.GetValues(typeof (TEnum))
                   .Cast<TEnum>()
                   .ToDictionary(t => t.ToString(), t => t.ToInt32(null /* 'culture' */));
    }
}

(enespañol!)
En lugar de ToDictionary,se puede utilizar cualquier metodo que quieres。 Tiene sentido?