【问题标题】:How to get enum Type by specifying its name in String如何通过在字符串中指定其名称来获取枚举类型
【发布时间】:2014-10-13 18:46:57
【问题描述】:

假设我有这个枚举:

namespace BusinessRule
{
    public enum SalaryCriteria : int
        {
            [EnumDisplayName(DisplayName = "Per Month")]
            Per_Month = 1,
            [EnumDisplayName(DisplayName = "Per Year")]
            Per_Year = 2,
            [EnumDisplayName(DisplayName = "Per Week")]
            Per_Week = 3
        }
}

我在一个字符串变量中有它的名字,比如:

string EnumAtt = "SalaryCriteria";

我正在尝试检查此枚举是否由此名称定义,如果已定义,我想获取它的实例。我已经尝试过这样,但 type 正在返回 null

string EnumAtt = "SalaryCriteria";
Type myType1 = Type.GetType(EnumAtt);

我也试过这个:

string EnumAtt = "BusinessRule.SalaryCriteria";
Type myType1 = Type.GetType(EnumAtt);

知道如何实现这一点。

【问题讨论】:

  • @Rawling 这不是重复的,我见过这些问题,但我的情况完全不同
  • @Rawling:他在编译时不知道枚举类型。您已经可以从不同的标题中看到这一点。
  • @TimSchmelter 你说得对,我希望它在执行时间
  • 我重新打开了,但标题有点误导。

标签: c# reflection types enums


【解决方案1】:

这对我很有用。

Type myType1 = Type.GetType("BusinessRule.SalaryCriteria");

我试过没有“EnumDisplayName”属性。

【讨论】:

  • 类型是在不同的程序集中定义的,因此您必须使用程序集限定名称。
  • @ken2k 如何知道程序集名称 程序集名称是什么?
【解决方案2】:

这很好用:

using System;

namespace BusinessRule
{
  public enum SalaryCriteria : int
  {
    Per_Month = 1,

    Per_Year = 2,

    Per_Week = 3
  }
}

namespace ConsoleApplication16
{
  internal class Program
  {
    private static void Main()
    {
      string EnumAtt = "BusinessRule.SalaryCriteria";
      Type myType1 = Type.GetType(EnumAtt);

      Console.WriteLine(myType1.AssemblyQualifiedName);
      Console.ReadLine();
    }
  }
}

【讨论】:

  • 类型是在不同的程序集中定义的,因此您必须使用程序集限定名称。
【解决方案3】:

要在当前 AppDomain 中搜索所有加载的程序集以查找给定的枚举——无需完全限定的程序集名称——您可以这样做:

    public static Type GetEnumType(string enumName)
    {
        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            var type = assembly.GetType(enumName);
            if (type == null)
                continue;
            if (type.IsEnum)
                return type;
        }
        return null;
    }

例如(选择一个不在我的程序集中的semi-random enum):

var type1 = Type.GetType("System.Xml.Linq.LoadOptions") // Returns null.
var type2 = GetEnumType("System.Xml.Linq.LoadOptions") // Returns successfully.

您的名称仍应包含命名空间。

【讨论】:

    【解决方案4】:

    一个受 LINQ 启发的答案:

    public static Type GetEnumType(string name)
    {
      return 
       (from assembly in AppDomain.CurrentDomain.GetAssemblies()
        let type = assembly.GetType(name)
        where type != null
           && type.IsEnum
        select type).FirstOrDefault();
    }
    

    原因是你需要遍历所有加载的程序集,而不仅仅是当前程序集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      • 1970-01-01
      • 2018-04-05
      相关资源
      最近更新 更多