C# 如果对象是泛型列表
有没有办法确定一个对象是否是通用列表?我不想知道列表的类型,我只知道它是一个列表。如何确定呢?System.Object类中有一个GetType()函数。你试过了吗?试一下:C# 如果对象是泛型列表,c#,.net,vb.net,list,generics,C#,.net,Vb.net,List,Generics,有没有办法确定一个对象是否是通用列表?我不想知道列表的类型,我只知道它是一个列表。如何确定呢?System.Object类中有一个GetType()函数。你试过了吗?试一下: if(yourList.GetType().IsGenericType) { var genericTypeParams = yourList.GetType().GetGenericArguments; //do something interesting with the types.. } 这将返回“Tru
if(yourList.GetType().IsGenericType)
{
var genericTypeParams = yourList.GetType().GetGenericArguments;
//do something interesting with the types..
}
这将返回“True”
List myList=new List();
Write(myList.GetType().IsGenericType&&myList是IEnumerable);
你想知道这是不是一张“名单”。。。或者您是否同意它是IEnumerable和Generic?以下方法将返回Generic集合类型的项类型。 如果类型未实现ICollection,则返回null
static Type GetGenericCollectionItemType(Type type)
{
if (type.IsGenericType)
{
var args = type.GetGenericArguments();
if (args.Length == 1 &&
typeof(ICollection<>).MakeGenericType(args).IsAssignableFrom(type))
{
return args[0];
}
}
return null;
}
静态类型GetGenericCollectionItemType(类型类型)
{
if(type.IsGenericType)
{
var args=type.GetGenericArguments();
如果(args.Length==1&&
typeof(ICollection).MakeGenericType(args.IsAssignableFrom(type))
{
返回参数[0];
}
}
返回null;
}
编辑:上述解决方案假定指定类型具有自己的泛型参数。这不适用于使用硬编码泛型参数实现ICollection的类型,例如:
class PersonCollection : List<Person> {}
class PersonCollection:List{}
下面是一个新的实现,它将处理这种情况
static Type GetGenericCollectionItemType(Type type)
{
return type.GetInterfaces()
.Where(face => face.IsGenericType &&
face.GetGenericTypeDefinition() == typeof(ICollection<>))
.Select(face => face.GetGenericArguments()[0])
.FirstOrDefault();
}
静态类型GetGenericCollectionItemType(类型类型)
{
返回类型。GetInterfaces()
.Where(face=>face.IsGenericType&&
face.GetGenericTypeDefinition()==typeof(ICollection))
.Select(face=>face.GetGenericArguments()[0])
.FirstOrDefault();
}
这个问题模棱两可
答案取决于你所说的一般列表是什么意思
- 名单
- 从列表派生的类
- 实现IList的类(在这种情况下,可以将数组视为泛型列表-例如int[]实现IList)
- 一个泛型并实现IEnumerable的类(这是中建议的测试)?但是,这也会认为下面的病态类是一个通用的列表:
公共类MyClass:IEnumerable
{
IEnumerator IEnumerable.GetEnumerator()
{
返回null;
}
}
最佳解决方案(例如是否使用GetType、IsAssignableFrom等)取决于您的意思。接受的答案不能保证IList的类型。 检查此版本,它适用于我:
private static bool IsList(object value)
{
var type = value.GetType();
var targetType = typeof (IList<>);
return type.GetInterfaces().Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == targetType);
}
private static bool IsList(对象值)
{
var type=value.GetType();
var targetType=typeof(IList);
返回类型.GetInterfaces().Any(i=>i.IsGenericType
&&i.GetGenericTypeDefinition()==targetType);
}
Event虽然这可能不是一个“完美”的答案,但我不明白为什么它被标记为-1。来吧,伙计们,这不是最好的答案,但尽量不要损害某人的声誉。GetType将返回特定的泛型列表,而不是它只是一个泛型列表。此列表当前未编译。也许是在2008年。嘿@sonicblis,“IEnumerable”在名称空间“System.Collections”中。您没有使用System.Collections的代码>在你的小提琴里。2016年仍在编辑:)
public class MyClass<T> : IEnumerable
{
IEnumerator IEnumerable.GetEnumerator()
{
return null;
}
}
private static bool IsList(object value)
{
var type = value.GetType();
var targetType = typeof (IList<>);
return type.GetInterfaces().Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == targetType);
}