How to get Enum type using Enum name?

D

Don

How do I get an Enum's type using only the Enum name?

e.g.

Dim enumType as System.Type
Dim enumName as String = "MyEnum"

enumType = ???(enumName)


I've tried using Type.GetType(enumName) to retrieve an Enum's type by name,
but I always get the value Nothing in return.

- Don
 
S

steve

not sure i follow, don...

all enums only have integer/numeric members. perhaps you mean something
else?


| How do I get an Enum's type using only the Enum name?
|
| e.g.
|
| Dim enumType as System.Type
| Dim enumName as String = "MyEnum"
|
| enumType = ???(enumName)
|
|
| I've tried using Type.GetType(enumName) to retrieve an Enum's type by
name,
| but I always get the value Nothing in return.
|
| - Don
|
|
 
D

Don

?

I don't understand what the possible values of an Enum has to do with
getting a Type object for an Enum.
 
H

Herfried K. Wagner [MVP]

Don said:
How do I get an Enum's type using only the Enum name?

e.g.

Dim enumType as System.Type
Dim enumName as String = "MyEnum"

enumType = ???(enumName)


I've tried using Type.GetType(enumName) to retrieve an Enum's type by
name,
but I always get the value Nothing in return.


Make sure you fully qualify the type name correctly. You can determine a
type's full name by using 'GetType(<type name>).FullName'.
 
S

steve

the quandry, of course, is that the type of object of an enum is...enum. the
possible values of the members of an enum were not what i commented on, but
the fact that the members themselves are all, and always, integer values.

hence, to me, you question is a bit vexing...an enum object is an enum type
and its members are integers.

could you be more specific is what it is you'd like to discover about an
enum?


| ?
|
| I don't understand what the possible values of an Enum has to do with
| getting a Type object for an Enum.
|
|
| > not sure i follow, don...
| >
| > all enums only have integer/numeric members. perhaps you mean something
| > else?
| >
| >
| > | > | How do I get an Enum's type using only the Enum name?
| > |
| > | e.g.
| > |
| > | Dim enumType as System.Type
| > | Dim enumName as String = "MyEnum"
| > |
| > | enumType = ???(enumName)
| > |
| > |
| > | I've tried using Type.GetType(enumName) to retrieve an Enum's type by
| > name,
| > | but I always get the value Nothing in return.
| > |
| > | - Don
| > |
| > |
| >
| >
|
|
 
S

steve

lemme guess, you have an function/sub/property param that could be one of
many enum's and you're trying to decide, by name, which to use for
conversion/validation/action to preform?

is it that or something similar?


| ?
|
| I don't understand what the possible values of an Enum has to do with
| getting a Type object for an Enum.
|
|
| > not sure i follow, don...
| >
| > all enums only have integer/numeric members. perhaps you mean something
| > else?
| >
| >
| > | > | How do I get an Enum's type using only the Enum name?
| > |
| > | e.g.
| > |
| > | Dim enumType as System.Type
| > | Dim enumName as String = "MyEnum"
| > |
| > | enumType = ???(enumName)
| > |
| > |
| > | I've tried using Type.GetType(enumName) to retrieve an Enum's type by
| > name,
| > | but I always get the value Nothing in return.
| > |
| > | - Don
| > |
| > |
| >
| >
|
|
 
D

Don

When you create an Enum, you create a new Type. Any variable that is
declared as an Enum has that Enum as it's type. A variable is not of type
Integer when declared as an Enum you've created. The System.Type class even
has a property call IsEnum. I've written other code that retrieves all
nested types of a class, and Enums declared in the class are returned as
Types. I know you can get the Type of an Enum. I just can't seem to get it
to work when I'm just passing the name of the Enum to Type.GetType().

I am trying to determine all the members of an Enum, given only the Enum's
name. That is, I want to get the Enum's Type so I can use the
Enum.GetNames() or Enum.GetValues() method to retrieve a list of all of its
members. I don't know how else to put it.
 
D

Don

Hmmm... What you suggest works, but only if the Enum is declared in the same
project. If I try to do the same thing with an Enum declared in a
referenced dll, then the Type.GetType() method returns Nothing.

This is the code I am executing:

Public Enum abc
val1 = 1
val2 = 2
End Enum

Dim s As String
s = GetType(abc).FullName

Dim t As Type
t = Type.GetType(s) ' <--- Works!

This works fine. However, if, say, the "abc" Enum existed in a dll that I
was referencing, the code does not work:

' (assuming "abc" is a publicly declared Enum in a public module called
' "Enumerations" in the referenced class library "OtherDLL")
Dim s As String
s = GetType(OtherDLL.Enumerations.abc).FullName

Dim t As Type
t = Type.GetType(s) ' <--- Fails!
 
D

Don

I just discovered that the following code works:

' (assuming "abc" is a publicly declared Enum in a public module called
' "Enumerations" in the referenced class library "OtherDLL")
Dim s As String
s = GetType(OtherDLL.Enumerations.abc).AssemblyQualifiedName '<--- NOT
FullName

Dim t As Type
t = Type.GetType(s) ' <--- Works!

Thanks for pointing me into the right direction.

- Don
 
D

Don

Duh. I forgot that I will only have the name of the Enum as a string to
start with. It doesn't look like I'll be able to do this because the
AssembylQualifiedName -- which is what I need to start off with -- contains
version information which may change, so it cannot be hardcoded into my
project. Argh!
 
D

Don

Success! To do what I want to do I will simply need to know one more thing:
the assembly the Enum is declared in. Here is a sample of code that works
(I am typing this in manually, so it's a little different from my executing
code):

' Known information about Enum
Dim assemblyName as String = "OtherDLL"
Dim enumName as String = "OtherDLL.Enumerations+abc" ' Note the "+"

Dim ax As System.Reflection.Assembly = _
System.Reflection.Assembly.Load(assemblyName)
Dim tx As Type = ax.GetType(enumName) ' <--- Works!

Now I can get what I am looking for using the following code:

Dim a1 As Array
a1 = [Enum].GetNames(tx)


- Don
 
D

Don

And an additional tip to those following in my footsteps: You can easily get
the assembly name from the full name of the Enum using the following bit of
code:

assemblyName = enumName.Substring(0, InStr(enumName, ".") - 1)

Use this and you don't need to separately store the assembly name.

- Don


Don said:
Success! To do what I want to do I will simply need to know one more thing:
the assembly the Enum is declared in. Here is a sample of code that works
(I am typing this in manually, so it's a little different from my executing
code):

' Known information about Enum
Dim assemblyName as String = "OtherDLL"
Dim enumName as String = "OtherDLL.Enumerations+abc" ' Note the "+"

Dim ax As System.Reflection.Assembly = _
System.Reflection.Assembly.Load(assemblyName)
Dim tx As Type = ax.GetType(enumName) ' <--- Works!

Now I can get what I am looking for using the following code:

Dim a1 As Array
a1 = [Enum].GetNames(tx)


- Don


Don said:
Duh. I forgot that I will only have the name of the Enum as a string to
start with. It doesn't look like I'll be able to do this because the
AssembylQualifiedName -- which is what I need to start off with -- contains
version information which may change, so it cannot be hardcoded into my
project. Argh!


'<---
NOT that type
by
 
S

steve

hmmm...

so you're saying that when you create an enum, you are actually creating an
object who's base class is enum? such that:

enum foo
bar = 0
end enum

dim e as foo
if typeof e is foo then return true

would not throw an error and neither would:

dim e as object = foo
if typeof e is enum then return true

both would return true...that about right? perhaps, i just haven't had need
to discover that nuance yet. i have seen in this ng code that does exactly
what you're wanting to do. have you googled yet?


| When you create an Enum, you create a new Type. Any variable that is
| declared as an Enum has that Enum as it's type. A variable is not of type
| Integer when declared as an Enum you've created. The System.Type class
even
| has a property call IsEnum. I've written other code that retrieves all
| nested types of a class, and Enums declared in the class are returned as
| Types. I know you can get the Type of an Enum. I just can't seem to get
it
| to work when I'm just passing the name of the Enum to Type.GetType().
|
| I am trying to determine all the members of an Enum, given only the Enum's
| name. That is, I want to get the Enum's Type so I can use the
| Enum.GetNames() or Enum.GetValues() method to retrieve a list of all of
its
| members. I don't know how else to put it.
|
|
|
| > the quandry, of course, is that the type of object of an enum is...enum.
| the
| > possible values of the members of an enum were not what i commented on,
| but
| > the fact that the members themselves are all, and always, integer
values.
| >
| > hence, to me, you question is a bit vexing...an enum object is an enum
| type
| > and its members are integers.
| >
| > could you be more specific is what it is you'd like to discover about an
| > enum?
| >
| >
| > | > | ?
| > |
| > | I don't understand what the possible values of an Enum has to do with
| > | getting a Type object for an Enum.
| > |
| > |
| > | > not sure i follow, don...
| > | >
| > | > all enums only have integer/numeric members. perhaps you mean
| something
| > | > else?
| > | >
| > | >
| > | > | > | > | How do I get an Enum's type using only the Enum name?
| > | > |
| > | > | e.g.
| > | > |
| > | > | Dim enumType as System.Type
| > | > | Dim enumName as String = "MyEnum"
| > | > |
| > | > | enumType = ???(enumName)
| > | > |
| > | > |
| > | > | I've tried using Type.GetType(enumName) to retrieve an Enum's type
| by
| > | > name,
| > | > | but I always get the value Nothing in return.
| > | > |
| > | > | - Don
| > | > |
| > | > |
| > | >
| > | >
| > |
| > |
| >
| >
|
|
 
D

Don

This is the solution to my problem (which I posted in a different branch of
my original thread):

' Known information about Enum
Dim assemblyName as String = "OtherDLL"
Dim enumName as String = "OtherDLL.Enumerations+abc"

Dim ax As System.Reflection.Assembly = _
System.Reflection.Assembly.Load(assemblyName)
Dim tx As Type = ax.GetType(enumName)

What's stored in the tx variable is the result I was seeking. I wanted to
get the type of an Enum using just a string containing the Enum's name.
This is how to do it (when the Enum is in a different assembly). It boils
down to this:

<Assembly>.GetType(<EnumNameAsString>)

- Don
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top