C# 如何使用泛型和反射复制列表的子集

C# 如何使用泛型和反射复制列表的子集,c#,generics,reflection,C#,Generics,Reflection,我需要将项目的子集从一个列表复制到另一个列表。但是,我不知道列表中有什么类型的项,甚至不知道传递的对象是否是列表 我可以通过以下代码查看对象是否是列表 t = DataSource.GetType(); if (t.IsGenericType) { Type elementType = t.GetGenericArguments()[0]; } 我看不到的是如何获取列表中的单个对象,以便将所需对象复制到新列表。您编写的代码不会告诉您类型是否为列表。 您可以做的是: IList lis

我需要将项目的子集从一个列表复制到另一个列表。但是,我不知道列表中有什么类型的项,甚至不知道传递的对象是否是列表

我可以通过以下代码查看对象是否是列表

t = DataSource.GetType();

if (t.IsGenericType)
{
    Type elementType = t.GetGenericArguments()[0];
}

我看不到的是如何获取列表中的单个对象,以便将所需对象复制到新列表。

您编写的代码不会告诉您类型是否为列表。
您可以做的是:

IList list = DataSource as IList;
if (list != null)
{
  //your code here....
}
这将告诉您数据源是否实现了
IList
接口。
另一种方式是:

    t = DataSource.GetType();

    if (t.IsGenericType)
    {
        Type elementType = t.GetGenericArguments()[0];
        if (t.ToString() == string.Format("System.Collections.Generic.List`1[{0}]", elementType))
        {
              //your code here
        }
    }

((IList)数据源)[i]
将从列表中获取
i
th元素(如果它实际上是一个列表)。

大多数列表类型实现非泛型的
System.Collections.IList

IList sourceList = myDataSource as IList;
if (sourceList != null)
{
    myTargetList.Add((TargetType)sourceList[0]);
}
您还可以
使用System.Linq并执行以下操作:

IEnumerable sourceList = myDataSource as IEnumerable;
if (sourceList != null)
{
    IEnumerable<TargetType> castList = sourceList.Cast<TargetType>();
    // or if it can't be cast so easily:
    IEnumerable<TargetType> convertedList =
        sourceList.Cast<object>().Select(obj => someConvertFunc(obj));

    myTargetList.Add(castList.GetSomeStuff(...));
}
IEnumerable sourceList=myDataSource作为IEnumerable;
if(sourceList!=null)
{
IEnumerable castList=sourceList.Cast();
//或者,如果它不能如此容易地铸造:
IEnumerable可转换列表=
sourceList.Cast().Select(obj=>someConvertFunc(obj));
添加(castList.GetSomeStuff(…);
}

Yikes!字符串比较有什么用?正确的方法是
t.GetGenericTypeDefinition()==typeof(List)