Преобразовать объект (который представляет собой список <T>) в список <object> - PullRequest
0 голосов
/ 18 июня 2020

Метод, который я переопределяю, имеет следующую сигнатуру.

public override bool IsValid(object value)

Переданный объект является списком, но его тип неизвестен. Это может быть List<string> или List<int>.

Мне нужно преобразовать это в List<object>. Я пробовал

if (!(value is IList temp))
{
    return false;
}

List<object> list = temp.OfType<object>().ToList();

, который работает, но он отфильтровывает любые нулевые значения, предположительно потому, что они не OfType<object>

Итак, как лучше всего это сделать?

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Если введено либо List<int>, либо List<string> и ничего больше, то я думаю, что лучше всего проверить именно эти типы. Что-то вроде:

List<object> list ;
if (value is List<int> listOfInts) 
{
   list = listOfInts.Cast<object>().ToList();
} 
else if (value is List<string> listOfStrings) 
{
   list = listOfStrings.Cast<object>().ToList();
} 
else 
{
   throw new ArgumentException(...);
}

Это может показаться избыточным, но это может сэкономить вам много головной боли в будущем, поскольку вы поймаете, если кто-то пройдет List<SomethingElse> или даже List<object>, что приведет к быть незаконным в соответствии с вашей спецификацией.

0 голосов
/ 18 июня 2020

temp.OfType (). ToList ();

OfType проверяет, имеет ли элемент требуемый тип, и если да, то помещает его в новый временный список.

То, что вы просите, - это просто приведение, поскольку каждый экземпляр в C# является object: (List<object>)temp. Изменить: очевидно, ковариация здесь не работает.

Нет абсолютно никаких причин для этого, вы можете просто пронумеровать его как есть: foreach(var obj in (IList)temp). Все коллекции реализуют интерфейс IList non-generi c.

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