2015-12-14 3 views
2

Я хочу получить доступ к элементам списков, переданных как «объект» (функция также обрабатывает другие типы данных, такие как массивы). К сожалению, в то время как это работает:Элементы доступа C#, перечисленные как тип объекта

List<object> objectlist = new List<object> { "1", "2" }; 
object res = ((List<object>)((object)objectlist))[0]; 

это не делает:

List<string> strlist = new List<string> { "1", "2" }; 
res = (string)((List<object>)((object)strlist))[0]; 

хотя он работает с массивами.

Невозможно преобразовать обычные списки в список.

ли с помощью отражения (но с GetMethods, чтобы избежать повторных строк поиска):

MethodInfo info = ((object)list).GetType().GetMethod("get_Item"); 
object s1 = (object)info.Invoke(((object)list), new object[] { 0 }); 

единственный способ сделать это?

ответ

3

Нет, List<string> не List<object> ... хотя являетсяIEnumerable<object> из-за общей ковариации. Тем не менее, List<int> не является даже IEnumerable<object>, поскольку ковариация не применяется к аргументам типа типа значения. К счастью, это is a IEnumerable.

Таким образом, чтобы получить первый элемент произвольного объекта, который вы знаете, орудия IEnumerable, я бы просто использовать:

object first = ((IEnumerable) source).Cast<object>().First(); 

(Из-за IEnumerator не реализует IDisposable, более «ручной» способ сделать это конец вверху немного затруднительно.)

1

List<T> реализует не общие IList. Если вы хотите получать только элементы из списка, вы можете использовать его. Одномерные массивы также реализуют его, поэтому литые будут работать как для массивов, так и для списков

res = (string)((IList)((object)strlist))[0];