我知道我可以创建一个类型只在运行时知道的对象:
Type t = record.GetType();
var src = Activator.CreateInstance(t.BaseType);
List<Record>=new List<Record>()
之类的操作?假设我正在使用像这样的反射
获取子记录列表 var ChildRecorList=src.GetType().GetProperty(propName).GetValue(src, null);
然后我如何使用foreach
或for
循环遍历此循环,因为foreach
仅适用于已知类型列表。它现在可以使用var类型。有没有办法将Reflection值强制转换为在运行时已知其值的特定类型(在第1点中提到)
答案 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>();
}
这将允许您从运行时传入的任何类型创建列表。