2

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

验证对象是否是列表很容易:

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

5 回答 5

7

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

 myobject.GetType().GetInterface("System.Collections.Generic.IList").GetGenericArguments()[0].IsEnum
于 2012-09-27T08:40:14.733 回答
5

您可以查看索引器的PropertyTypevia 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

于 2012-09-27T08:39:42.957 回答
2

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

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

于 2012-09-27T08:40:48.883 回答
0

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

如果列表是泛型的,则检查枚举类型的泛型类型参数。

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

于 2012-09-27T08:45:33.250 回答
0

大家提出的解决方案:

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

if (list is IList<Days>)
{
    Console.WriteLine("list has days");
}
于 2012-09-27T08:50:02.820 回答