如何检查对象是否是列表枚举类型对象?

时间:2012-09-27 08:37:22

标签: c# list enums

我有一个对象,可以是不同枚举类型或非枚举类型(普通类实例)的列表。

验证对象是否是列表很简单:

myobject is IList

现在我可以验证列表元素的类型:

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

但如果我的列表的元素是枚举,如何验证我是否还没有元素?

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

5 个答案:

答案 0 :(得分:7)

IList可以包含它想要的任何类型,因此如果您没有任何内容,则无法检查。如果您实际上有一个泛型类型,则可以使用Type的GetGenericArguments方法进行检查。 (如果您有一些正在实现IList但没有IList类型的东西,则添加了GetInterface,因为它是第一个通用参数。)

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

答案 1 :(得分:5)

您可以通过PropertyType

查看索引器的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

演示:http://ideone.com/3JyEf

答案 2 :(得分:2)

只有IList你不能这样做--Ilist不会保证它内部的对象类型,也不会让你知道它会接受的对象类型。

如果可能,请考虑使用通用veriosn IList<T> - 您将能够获得列表中没有元素的类型。

答案 3 :(得分:0)

除非您的列表是通用列表,否则您不能,因为非通用列表可能包含任何对象。

如果list是通用的,则检查枚举类型的泛型类型参数。

如果list不是通用的,请尝试通过检查AddIndexOf或索引器方法的参数来解析项类型。这是一种非常难看的方式,但可能会给你一个线索,因为许多旧的实现继承了List对象并添加了Add重载,或者一些新的和惰性实现可能用于隐藏泛型参数比如public class MyObjectList: List<MyObject> {}

答案 4 :(得分:0)

每个人都在提议的解决方案:

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

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