Как назвать дополнительный метод “ElementAt” Списка <T> с отражением?

У меня есть проблема, что после создания объекта "oListType01" списка типов <MyClass01> и после присвоения она к другому objet "oObjectType" типа "возражает", что я не могу больше получать доступ к функциональному "ElementAt (1)". Я попробовал при помощи отражения, но я всегда получаю исключение (конфликт параметра) в "Вызывают" метод. Кто-либо знает почему? Милан

MyClass01 oMy1 = new MyClass01();
oMy1._ID = "1";

MyClass01 oMy2 = new MyClass01();
oMy2._ID = "3";

IList<MyClass01> oListType01 = new List<MyClass01>();

oListType01.Add(oMy1);
oListType01.Add(oMy2);

object oObjectType = new object();

oObjectType = oListType01;

Отсюда fowrads только возражают, что oObjectType доступен (вверх происходит в вызове отдельной функции в реальном случае). На шоу VS oObjectType два элемента, к которым я хотел бы получить доступ на отражение.

MethodInfo mInfo = typeof(System.Linq.Enumerable).GetMethod("ElementAt").MakeGenericMethod(typeof(object));
object oSingleObject = mInfo.Invoke(oObjectType, new object[] { 1 });
7
задан abatishchev 19 May 2017 в 00:03
поделиться

4 ответа

Я предполагаю, что у вас есть веская причина, но это кажется немного неправильным. Вот код, который выполнит то, что вы пытаетесь сделать.

MethodInfo mInfo = typeof(System.Linq.Enumerable).GetMethod("ElementAt").MakeGenericMethod(typeof(MyClass01));
object oSingleObject = mInfo.Invoke(oObjectType, new object[] { oObjectType, 1 });

Когда я запускаю этот код, я получаю второй элемент в Списке.

.
9
ответ дан 7 December 2019 в 03:16
поделиться

Метод расширения ElementAt, вероятно, находится в IEnumerable и поэтому, когда вы относитесь к списку как к объекту, метод расширения не будет доступен, пока вы его не приведёте. Либо ((List)oObjectType).ElementAt(), либо (oObjectType как List).ElementAt().

Я должен спросить, однако, со всем уважением, зачем вам вообще это нужно? Меня поражает, что здесь что-то не так, что можно было бы сделать немного чище, используя интерфейсы.

.
0
ответ дан 7 December 2019 в 03:16
поделиться

Если мы можем с уверенностью предположить, что:

  • oObjectType - это IEnumerable некоторого T

, то вот код для извлечения элементов из него.

Обратите внимание, что я серьезно задаюсь вопросом, является ли это правым способом, но вы не дали нам достаточно информации, которая помогла бы вам выяснить, есть ли лучший способ, так что все, что у нас осталось - это просто ответить на вопрос в том виде, в каком он был задан.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Diagnostics;

namespace ConsoleApplication2
{
    class MyClass01
    {
        public String _ID;

        public override string ToString()
        {
            return _ID;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass01 oMy1 = new MyClass01();
            oMy1._ID = "1";

            MyClass01 oMy2 = new MyClass01();
            oMy2._ID = "3";

            IList<MyClass01> oListType01 = new List<MyClass01>();

            oListType01.Add(oMy1);
            oListType01.Add(oMy2);

            object oObjectType = new object();

            oObjectType = oListType01;

            Test(oObjectType);

            Console.In.ReadLine();
        }

        private static void Test(object oObjectType)
        {
            Type tObject = oObjectType.GetType();
            Debug.Assert(tObject.IsGenericType);
            Debug.Assert(tObject.GetGenericArguments().Length == 1);
            Type t = tObject.GetGenericArguments()[0];

            Type tIEnumerable = typeof(IEnumerable<>).MakeGenericType(t);
            Debug.Assert(tIEnumerable.IsAssignableFrom(tObject));

            MethodInfo mElementAt =
                typeof(Enumerable)
                .GetMethod("ElementAt")
                .MakeGenericMethod(t);

            Console.Out.WriteLine("o[0] = " +
                mElementAt.Invoke(null, new Object[] { oObjectType, 0 }));
            Console.Out.WriteLine("o[1] = " +
                mElementAt.Invoke(null, new Object[] { oObjectType, 1 }));
        }
    }
}
0
ответ дан 7 December 2019 в 03:16
поделиться

Это действительно похоже на Ваш другой вопрос , но в этом случае статический метод ElementAt на самом деле требует двух параметров. Попробуйте это:

объект oSingleObject = mInfo.Invoke(null, new object[] { oObjectType, 1 });

.
0
ответ дан 7 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: