У меня есть проблема, что после создания объекта "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 });
Я предполагаю, что у вас есть веская причина, но это кажется немного неправильным. Вот код, который выполнит то, что вы пытаетесь сделать.
MethodInfo mInfo = typeof(System.Linq.Enumerable).GetMethod("ElementAt").MakeGenericMethod(typeof(MyClass01));
object oSingleObject = mInfo.Invoke(oObjectType, new object[] { oObjectType, 1 });
Когда я запускаю этот код, я получаю второй элемент в Списке.
. Метод расширения ElementAt, вероятно, находится в IEnumerable
Я должен спросить, однако, со всем уважением, зачем вам вообще это нужно? Меня поражает, что здесь что-то не так, что можно было бы сделать немного чище, используя интерфейсы.
.Если мы можем с уверенностью предположить, что:
, то вот код для извлечения элементов из него.
Обратите внимание, что я серьезно задаюсь вопросом, является ли это правым способом, но вы не дали нам достаточно информации, которая помогла бы вам выяснить, есть ли лучший способ, так что все, что у нас осталось - это просто ответить на вопрос в том виде, в каком он был задан.
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 }));
}
}
}
Это действительно похоже на Ваш другой вопрос , но в этом случае статический метод ElementAt на самом деле требует двух параметров. Попробуйте это:
объект oSingleObject = mInfo.Invoke(null, new object[] { oObjectType, 1 });
.