【问题标题】:Dynamically find enum values based on enum name根据枚举名称动态查找枚举值
【发布时间】:2013-09-14 12:24:17
【问题描述】:

我有 1 个这样的“car_brands”枚举声明:

public enum Car_brands
{
    Audi = 1,
    ...
    ...
}

和许多其他这样的每个“car_brand”的枚举声明

public enum Audi
{
    model_a3 = 1,
    model_a4 = 2,
    ...
}

我有 2 个关联的组合框。与 car_brands 相关的一项:

 comboBox1.DataSource = new BindingSource(Car_brands.Keys, null);

我希望另一个组合框填充选定品牌的枚举(例如奥迪的奥迪枚举模型)。

我试试这个,但它似乎不准确......

private void comboBox3_SelectedValueChanged(object sender, EventArgs e)
        {
string value = comboBox1.Text;   //car brand
Type type = Type.GetType(value);
var brand_models = Enum.GetNames(type.GetType());
                foreach (string enumValue in brand_models)
                    {
                        string brand_model = enumValue;
                        MessageBox.Show(brand_model);
                    }

        }

【问题讨论】:

  • 仅供参考 - 您不需要在枚举中显式设置数字,它会自动完成。
  • 我也在我的程序后面使用它们作为值...谢谢
  • 我的意思是,如果你取消 int 赋值,它们仍然会代表 1、2、3... 等等,所以没有必要。
  • “不准确”是什么意思?是有效还是无效?
  • @James,当一个值在数据库中表示一个值时,当显式设置时更容易查找。

标签: c# reflection combobox enums


【解决方案1】:
Type type = Type.GetType("full namespace where you declare enum" + "." + value);
var brand_models = Enum.GetNames(type);

如果是嵌套类型,您需要使用"+" 而不是"."

C# : having a "+" in the class name?

【讨论】:

  • @Damith 我已经测试了很多选项:Type type = Type.GetType("Cars" + "." + value);或 Type type = Type.GetType("Cars."+value);但返回我 NULL
  • @c_conl 你错过了这一点,当你加载你需要使用 full 命名空间的类型时,例如MyApplication.Cars
【解决方案2】:

我可以想到很多更好的方法来解决您的任务,但这应该在您选择的情况下有效:

private void comboBox3_SelectedValueChanged(object sender, EventArgs e)
{
  string value = comboBox1.Text;   //car brand
  Type type = Type.GetType("YOUR_NAMESPACE." + value);
  var brand_models = Enum.GetNames(type);
  foreach (string enumValue in brand_models)
  {
    string brand_model = enumValue;
    MessageBox.Show(brand_model);
  }
}

请阅读 Type.GetType 文档 (to be found here) 以获得针对您的特定类层次结构和组装情况的正确解决方案。

【讨论】:

  • 您提供了实际的命名空间还是仅仅提供了“命名空间”?您需要提供实际的命名空间。
  • 我使用实际的命名空间:Type type = Type.GetType("Cars." + value);它总是返回NULL,我读到我必须使用AssemblyName,这是解决方案吗,我该怎么做?
  • 我假设 GUI 代码与枚举位于不同的程序集中。你能提供完整的图片吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多