如何通过指定枚举类型的名称字符串来获取枚举类型。

6

Suppose i have this Enum:

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:他在编译时不知道枚举类型。从不同的标题中,你已经可以看出来了。 - Tim Schmelter
@TimSchmelter,你说得对,我希望它在执行时生效。 - Ehsan Sajjad
要通过名称获取类型,您需要使用类似 Assembly.GetType(type-name) 的东西。 - Richard
2
我重新打开了它,但标题有点误导。 - ken2k
1
请参考此处:https://dev59.com/gXRA5IYBdhLWcg3wuAYo - dbc
显示剩余10条评论
4个回答

15

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

例如(选择一个不在我的程序集中的半随机枚举):

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

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

2

这对我非常有效。

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

在此输入图片描述

我尝试了不加上“EnumDisplayName”属性的写法。


类型定义在不同的程序集中,因此您必须使用程序集限定名称。 - ken2k
@ken2k 怎么知道程序集的名称是什么?程序集名称是什么? - Ehsan Sajjad

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

类型定义在不同的程序集中,因此您必须使用程序集限定名称。 - ken2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接