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

Ehs*_*jad 3 c# reflection enums types

假设我有这个枚举:

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
        }
}
Run Code Online (Sandbox Code Playgroud)

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

string EnumAtt = "SalaryCriteria";
Run Code Online (Sandbox Code Playgroud)

我试图检查这个枚举是否由这个名称定义,如果定义我想得到它的instance.i尝试这样,但type返回null:

        string EnumAtt = "SalaryCriteria";
        Type myType1 = Type.GetType(EnumAtt);
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

        string EnumAtt = "BusinessRule.SalaryCriteria";
        Type myType1 = Type.GetType(EnumAtt);
Run Code Online (Sandbox Code Playgroud)

任何想法我怎么能实现这一点.

dbc*_*dbc 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

var type1 = Type.GetType("System.Xml.Linq.LoadOptions") // Returns null.
var type2 = GetEnumType("System.Xml.Linq.LoadOptions") // Returns successfully.
Run Code Online (Sandbox Code Playgroud)

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