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

I have its name in a string variable like :

string EnumAtt = "SalaryCriteria";

i am trying to check if this Enum is defined by this name, and if defined i want to get its instance.i have tried like this, but type is returning null:

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

i have also tried this:

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

any idea how i can achieve this.

15
  • @Rawling it is not a duplicate, i have seen these questions but my scenario is toally different Commented Aug 20, 2014 at 12:07
  • @Rawling: He does not know the enum type at compile time. You can see that already from the different titles. Commented Aug 20, 2014 at 12:09
  • @TimSchmelter you got it right, i want it to be on execution time Commented Aug 20, 2014 at 12:09
  • 2
    I reopened it, but the title was a bit misleading. Commented Aug 20, 2014 at 12:10
  • 1
    Also here: stackoverflow.com/questions/851248/… Commented Aug 20, 2014 at 12:24

4 Answers 4

17

To search all loaded assemblies in the current AppDomain for a given enum -- without having the fully qualified assembly name -- you can do:

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

For instance (picking a semi-random enum which is not in my assembly):

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

You name should still include the namespace.

Sign up to request clarification or add additional context in comments.

Comments

4

A LINQ-inspired answer:

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

The reason is that you need to go through all loaded assemblies, not only the current assembly.

Comments

2

This works great for me.

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

enter image description here

I tried it without "EnumDisplayName" attribute.

2 Comments

The type is defined in a different assembly, so you'll have to use the assembly qualified name.
@ken2k how to know the assembly name what is the assembly name?
0

This works well:

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

1 Comment

The type is defined in a different assembly, so you'll have to use the assembly qualified name.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.