C# 遍历抽象类的字段(即列表)并将其传递给T类型的方法?
我有一个包含许多列表的类:C# 遍历抽象类的字段(即列表)并将其传递给T类型的方法?,c#,C#,我有一个包含许多列表的类: public static class CollectionsClass { public static List<Object1> list1 = new List<Object1>(); public static List<Object2> list2 = new List<Object2>(); public static List<Object3> list3 = new
public static class CollectionsClass
{
public static List<Object1> list1 = new List<Object1>();
public static List<Object2> list2 = new List<Object2>();
public static List<Object3> list3 = new List<Object3>();
}
不幸的是,这给了我一个错误:
方法“app.ActionClass.Populate”的类型参数
(System.Collections.Generic.List,int,int)“”无法推断
从用法来看。尝试显式指定类型参数
所以,很明显,它有一些问题,不知道是什么
我要通过的类型。。。但是我认为从
field
可以明显看出,您可以使用GetValue
方法获取字段的值,对于该字段,您有一个FieldInfo
对象。然后需要使用正确的类型参数调用泛型方法。虽然可以使用反射构造,但我建议您尝试使用动态编程:
public static void PopulateCollections()
{
var fields = typeof(CollectionsClass).GetFields();
foreach (var fieldInfo in fields)
{
dynamic field = fieldInfo.GetValue(null);
Populate(field, 0, 1000);
}
}
上面的代码假设这些字段都是静态的,并且除了类型为
List
的字段之外,没有其他字段,我使用了反射:
public static class CollectionsClass
{
public static List<Object1> list1 = new List<Object1>();
public static List<Object2> list2 = new List<Object2>();
public static List<Object3> list3 = new List<Object3>();
}
public static class ActionClass
{
private static void Populate<T>(List<T> list, int minLimit, int maxLimit)
where T : new()
{
var rnd = new Random();
int rndNum = rnd.Next(minLimit, maxLimit);
for (int i = 0; i < rndNum; i++)
{
list.Add(new T());
}
}
public static void PopulateCollections()
{
var fields = typeof(CollectionsClass).GetFields(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
foreach (var field in fields)
{
var method = typeof(ActionClass).GetMethod("Populate", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).MakeGenericMethod(field.FieldType.GenericTypeArguments[0]);
method.Invoke(null, System.Reflection.BindingFlags.Static, null, new object[] { field.GetValue(null), 0, 1000 }, Thread.CurrentThread.CurrentCulture);
}
}
}
公共静态类集合类
{
public static List list1=新列表();
public static List list2=新列表();
public static List list3=新列表();
}
公共静态类ActionClass
{
私有静态无效填充(列表、int-minLimit、int-maxLimit)
其中T:new()
{
var rnd=新随机数();
int rndNum=rnd.Next(minLimit,maxLimit);
对于(int i=0;i
请显示您的实际代码。您的字段(列表)不是静态的,但您的类是静态的。这不会编译。变量field
不包含对列表的引用,而是对字段信息的引用。它在运行时“知道”字段的类型,但在编译时不知道。@Selman22编辑了代码,无法发布原始代码,sorry@KrisVandermotten这就是我想的。。。有没有办法得到指针?很遗憾,我不知道为什么,生成的列表的长度总是相等的。@Dmitry这是因为我使用了Random
的方式。我把它放到了课堂的环境中,长度现在变了。克里斯,这工作完美无瑕,只需最少的努力。非常感谢你。
public static void PopulateCollections()
{
var fields = typeof(CollectionsClass).GetFields();
foreach (var fieldInfo in fields)
{
dynamic field = fieldInfo.GetValue(null);
Populate(field, 0, 1000);
}
}
public static class CollectionsClass
{
public static List<Object1> list1 = new List<Object1>();
public static List<Object2> list2 = new List<Object2>();
public static List<Object3> list3 = new List<Object3>();
}
public static class ActionClass
{
private static void Populate<T>(List<T> list, int minLimit, int maxLimit)
where T : new()
{
var rnd = new Random();
int rndNum = rnd.Next(minLimit, maxLimit);
for (int i = 0; i < rndNum; i++)
{
list.Add(new T());
}
}
public static void PopulateCollections()
{
var fields = typeof(CollectionsClass).GetFields(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
foreach (var field in fields)
{
var method = typeof(ActionClass).GetMethod("Populate", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).MakeGenericMethod(field.FieldType.GenericTypeArguments[0]);
method.Invoke(null, System.Reflection.BindingFlags.Static, null, new object[] { field.GetValue(null), 0, 1000 }, Thread.CurrentThread.CurrentCulture);
}
}
}