C# 如果对象是泛型列表

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

有没有办法确定一个对象是否是通用列表?我不想知道列表的类型,我只知道它是一个列表。如何确定呢?

System.Object类中有一个GetType()函数。你试过了吗?

试一下:

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);
}