Как скопировать подмножество списка, используя дженерики и рефлексию - PullRequest
1 голос
/ 23 октября 2010

Мне нужно скопировать поднабор элементов из одного списка в другой. Однако я не знаю, какие элементы находятся в списке, или даже если передаваемый объект является списком.

Я могу видеть, является ли объект списком по следующему коду

t = DataSource.GetType();

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

Чего я не вижу, так это как добраться до отдельных объектов в списке, чтобы я мог скопировать необходимые объекты в новый список.

Ответы [ 3 ]

2 голосов
/ 23 октября 2010

Большинство типов списков реализуют неуниверсальные System.Collections.IList:

IList sourceList = myDataSource as IList;
if (sourceList != null)
{
    myTargetList.Add((TargetType)sourceList[0]);
}

Вы также можете быть using 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(...));
}
1 голос
/ 23 октября 2010

Код, который вы написали, не скажет вам, является ли тип списком.
Что вы можете сделать:

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
        }
    }
0 голосов
/ 23 октября 2010

((IList) DataSource)[i] получит i -й элемент из списка, если это фактически список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...