Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 遍历抽象类的字段(即列表)并将其传递给T类型的方法?_C# - Fatal编程技术网

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