Предположим, у меня есть это 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";

Я пытаюсь проверить, определено ли это Enum этим именем, и если оно определено, я хочу получить его экземпляр. Я пробовал вот так, но type возвращает null:

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

Я также пробовал это:

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

Любая идея, как я могу этого добиться.

5
Ehsan Sajjad 20 Авг 2014 в 16:04

4 ответа

Лучший ответ

Чтобы выполнить поиск во всех загруженных сборках в текущем домене приложения для данного перечисления - без полного имени сборки - вы можете сделать:

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

Например (выбор полуслучайного перечисления < / a> которого нет в моей сборке):

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

Ваше имя по-прежнему должно включать пространство имен.

13
dbc 20 Авг 2014 в 12:40

Ответ, вдохновленный 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();
}

Причина в том, что вам нужно просмотреть все загруженные сборки, а не только текущую сборку.

4
flindeberg 20 Авг 2014 в 12:59

Это отлично работает для меня.

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

enter image description here

Я пробовал без атрибута EnumDisplayName.

1
Igor 20 Авг 2014 в 12:18

Это хорошо работает:

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();
    }
  }
}
0
nvoigt 20 Авг 2014 в 12:18