Chris W
Chris W

Reputation: 1702

How to check if an object is a list enum type objects?

I have an object that can be a list of different enum types or non-enum types (normal class instances).

To verify if object is a list is easy:

myobject is IList

Now I can verify the type of list's elements:

(myobject as IList)[0].GetType().IsEnum

But how to verify if my list's elements are enums IF I have no elements yet ?

if (myobject is IList)
{ 
    if ((myobject as IList).Count > 0)
    {
        if ((myobject as IList)[0].GetType().IsEnum)
            return true;
    }
    else
    {
        // how to check if the list is enum list here ?
    }
}

Upvotes: 2

Views: 1507

Answers (5)

CrazyCasta
CrazyCasta

Reputation: 28302

An IList can contain whatever type it wants, so if you don't have any contents you have no way of checking. If you actually have a generic type to start with you can check by using the GetGenericArguments method of Type. (GetInterface added in case you have something that's implementing IList but doesn't have the IList type as it's first generic argument).

 myobject.GetType().GetInterface("System.Collections.Generic.IList").GetGenericArguments()[0].IsEnum

Upvotes: 7

MrFox
MrFox

Reputation: 5106

The solution everyone is proposing:

IList<Days> list = new List<Days>();

if (list is IList<Days>)
{
    Console.WriteLine("list has days");
}

Upvotes: 0

Tim Schmelter
Tim Schmelter

Reputation: 460038

You can look at the the indexer's PropertyType via Type.GetProperty:

List<int> list = new List<int>(); // an empty List<T>
Type type = list.GetType().GetProperty("Item").PropertyType; // System.Int32
bool isEnum = type.IsEnum; // of course false

List<DayOfWeek> days = new List<DayOfWeek>();
type = days.GetType().GetProperty("Item").PropertyType;
isEnum = type.IsEnum; // true

demo: http://ideone.com/3JyEf

Upvotes: 5

Erdogan Kurtur
Erdogan Kurtur

Reputation: 3685

Unless your list is a generic list you cannot, since a non generic list may contain any object.

If list is generic then inspect generic type parameters for enum types.

If list is not generic try to resolve item type by inspecting parameters of Add, IndexOf or indexer methods. It is a very ugly way to do it, but may give you a clue since many old implementations inherits List object and adds an Add overload, or some new and lazy implementations may be used to hide generic parameters like public class MyObjectList: List<MyObject> {}.

Upvotes: 0

Alexei Levenkov
Alexei Levenkov

Reputation: 100527

Having just IList you can't do that - IList does not gurantee types of objects inside of it and does not let you know type of objects it would accept.

Consider uisng generic veriosn IList<T> if possible - you'll be able to get type without elements in the list.

Upvotes: 2

Related Questions