Как создать определенный тип списка, чей параметр известен во время выполнения, а затем перебрать этот список?

c# reflection

184 просмотра

3 ответа

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

Type t = record.GetType();
var src = Activator.CreateInstance(t.BaseType);
  1. Как я могу сделать что-то вроде List<Record>=new List<Record>()во время выполнения?
  2. Предположим, я получаю список записей ребенка, используя Reflection, как это

    var ChildRecorList=src.GetType().GetProperty(propName).GetValue(src, null);

и как тогда я могу пройти через это с помощью foreachили forцикла, потому что foreachработает только для списка известных типов. Теперь он работает с типами var. Есть ли способ приведения значения Reflection к типу конкретного типа, значение которого известно во время выполнения (упомянуто в пункте 1)

Автор: Kashif R Источник Размещён: 12.11.2019 09:25

Ответы (3)


2 плюса

Решение

Вы можете попробовать это для создания универсального типа во время выполнения:

Type genericListType = typeof (List<>);

// if you have more than one generic argumens 
// you can add your types here like typeof(MyClass),typeof(MyClass2)
Type[] genericArguments = { typeof (Record) }; 

// create your generic type with generic arguments
Type myGenericType = genericListType.MakeGenericType(genericArguments);

// and then  you can create your instance
var recordList = Activator.CreateInstance(myGenericType);

// get your property value

recordList = src.GetType().GetProperty(propName).GetValue(src, null);

И я думаю, вы уверены, что ваш тип - это List, тогда, когда вы создаете свой экземпляр, вы можете сделать приведение типа этого:

 var recordList = (IList)Activator.CreateInstance(myGenericType);

Затем вы можете просмотреть свой список

foreach (var item in recordList)
{
    ...
}
Автор: Selman Genç Размещён: 04.01.2014 01:31

0 плюса

Я не уверен, что если вы ищете что-то подобное, но вы можете использовать список внутри другого списка или словаря. Кроме того, вы можете хранить базовое значение с любым типом и получать тип при необходимости, я рекомендую использовать словарь, чтобы как вы можете назвать свои списки:

Dictionary<String, List<Object>> Data = new Dictionary<String, List<Object>>();

Data["MyUser"] = new List<Object>();
Data["MyUser"].Add(MyDBObject);

var obj = Data["MyUser"].Find(x => x.MyKey == "MyKeyObject");
var t = obj.GetType();
var dta = (MyDBObject)obj;

foreach (var db in Data)
{
   if (db.Key == "MyUser")
      db.Value.Find(x => x.Name == "MyName");
}

Или, если вы ищете Создание списков во время выполнения:

List<List<Object>> Data = new List<List<Object>>();

var mydb = Data.Count;

Data.Add(new List<Object>());

Data[mydb].Add(MyOBJ);

foreach (var db in Data)
{
     if (db.Contains(MyOBJ)
         return db;
}
Автор: 111WARLOCK111 Размещён: 04.01.2014 01:21

0 плюса

Почему бы вам просто не использовать дженерики? Вы могли бы сделать что-то вроде этого:

public void DoSomething<T>(T type)
{
    var list = new List<T>();
}

Это позволит вам создать список из любого типа, переданного во время выполнения.

Автор: James Размещён: 04.01.2014 01:22
Вопросы из категории :
32x32