2015-02-06 3 views
0

У меня есть ситуация, когда я отражаюсь на множестве свойств во время выполнения. Когда я получаю фактическое значение свойства, это просто объект типа, но я делаю чек, чтобы подтвердить, что это общий список. В моем сценарии эти общие списки всегда будут содержать примитивные значения какого-либо типа (ints, strings, longs и т. Д.). Есть ли простой способ конвертировать любой тип списка в список строк? Как это:Список преобразований <T> в список <string> в общем

object obj = pi.GetValue(item, null); 
Type type = obj.GetType(); 
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) { 
    List<string> lstStrings = ???; 
} 

Или я должен иметь большое заявление переключателя и приведение к соответствующему типу исполнения списка первого затем преобразовать его в список?

благодаря

+1

'Object.ToString' –

+0

Полностью переписал свой ответ, пожалуйста, попробуйте. –

ответ

2

Cast список к необщего типа.

IEnumerable хорошо работает, хотя вы ограничены в том, какие методы доступны до тех пор, пока вы не включите его в IEnumerable<T>. Если у вас есть IEnumerable<T>, вы можете использовать ToString(), чтобы превратить элементы в строки.

var list = ((IEnumerable)obj).OfType<object>(); 
List<string> strings = list.Select(x => x.ToString()).ToList(); 
+0

Я придумал подобное решение, но нашел метод 'Cast' перед' OfType'. Разница в том, что 'OfType' делает фильтрацию. Поскольку все является «объектом», это прекрасно работает. Интересно, немного ли это накладные расходы? В любом случае, проверка того, что что-то является объектом, вероятно, сильно оптимизирована. –

+0

@MichaelWelch Я сомневаюсь, что фильтрация актуальна с точки зрения производительности. Я был сожжен, злоупотребляя Cast(), прежде чем я обычно придерживаюсь OfType(), поскольку у него есть дополнительный бонус от фильтрации нулей. –

+0

Спасибо за информацию о 'OfType'. На самом деле я никогда раньше не сталкивался с этим. –

1

В вашем операторе if приводится ваш obj в IEnumerable. Вы знаете, что это безопасно, потому что это список. Затем вы можете использовать Enumerable static methods Cast и Select.

List<String> list = ((IEnumerable)obj).Cast<Object>().Select(x => x.ToString()); 
Смежные вопросы