如何通过在String中指定其名称来获取枚举类型

时间:2014-08-20 12:04:56

标签: c# reflection types enums

假设我有这个枚举:

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";

我正在尝试检查此Enum是否由此名称定义,如果已定义我想获取其instance.i已尝试过这样,但type正在返回null

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

我也试过这个:

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

任何想法如何实现这一点。

4 个答案:

答案 0 :(得分:10)

要在当前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.

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

答案 1 :(得分:3)

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();
}

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

答案 2 :(得分:1)

这对我很有用。

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

enter image description here

我试过没有" EnumDisplayName"属性。

答案 3 :(得分:0)

这很有效:

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();
    }
  }
}