如何创建在运行时已知参数然后遍历此列表的特定列表类型?

时间:2014-01-04 12:37:00

标签: c# reflection

我知道我可以创建一个类型只在运行时知道的对象:

Type t = record.GetType();
var src = Activator.CreateInstance(t.BaseType);
  1. 如何在运行时执行List<Record>=new List<Record>()之类的操作?
  2. 假设我正在使用像这样的反射

    获取子记录列表

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

  3. 然后我如何使用foreachfor循环遍历此循环,因为foreach仅适用于已知类型列表。它现在可以使用var类型。有没有办法将Reflection值强制转换为在运行时已知其值的特定类型(在第1点中提到)

3 个答案:

答案 0 :(得分: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)
{
    ...
}

答案 1 :(得分:0)

我不确定如果您正在寻找类似的东西,但您可以使用List Inside另一个列表或字典,此外,您可以存储任何类型的基值并在需要时获取类型,我建议使用字典,以便您可以为列表命名:

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;
}

答案 2 :(得分:0)

为什么不使用泛型?你可以这样做:

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

这将允许您从运行时传入的任何类型创建列表。