我有一个对象,可以是不同枚举类型或非枚举类型(普通类实例)的列表。
验证对象是否是列表很简单:
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 ?
}
}
答案 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
答案 2 :(得分:2)
只有IList你不能这样做--Ilist不会保证它内部的对象类型,也不会让你知道它会接受的对象类型。
如果可能,请考虑使用通用veriosn IList<T>
- 您将能够获得列表中没有元素的类型。
答案 3 :(得分:0)
除非您的列表是通用列表,否则您不能,因为非通用列表可能包含任何对象。
如果list是通用的,则检查枚举类型的泛型类型参数。
如果list不是通用的,请尝试通过检查Add
,IndexOf
或索引器方法的参数来解析项类型。这是一种非常难看的方式,但可能会给你一个线索,因为许多旧的实现继承了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");
}