Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/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# 迭代已由反射动态调用的列表_C#_.net - Fatal编程技术网

C# 迭代已由反射动态调用的列表

C# 迭代已由反射动态调用的列表,c#,.net,C#,.net,我有一个类,它包含两个不同类类型的列表,它们都有一个Percent属性;我希望通过列表的名称动态获取其中一个列表(即,我希望将列表的名称传递给GetPropery方法以获取列表),然后迭代列表的条目。问题是,当我使用GetPropery方法时,这将得到一个对象,并且无法识别它是一个列表;所以我不能绕过去。 我要使用其属性的类: public class ModelOfExcel_VM : Object { public ModelOfExcel_VM() { }

我有一个类,它包含两个不同类类型的列表,它们都有一个
Percent
属性;我希望通过列表的名称动态获取其中一个列表(即,我希望将列表的名称传递给
GetPropery
方法以获取列表),然后迭代列表的条目。问题是,当我使用
GetPropery
方法时,这将得到一个
对象
,并且无法识别它是一个列表;所以我不能绕过去。 我要使用其属性的类:

public class ModelOfExcel_VM : Object
{
    public ModelOfExcel_VM()
    {
    }

    public List<Sheet_1_VM> Sheet1 { get; set; }
    public List<Sheet_2_VM> Sheet2 { get; set; }
    public List<Sheet_3_VM> Sheet3 { get; set; }
    public List<Sheet_4_VM> Sheet4 { get; set; }
    public List<Sheet_5_VM> Sheet5 { get; set; }
    public List<Sheet_6_VM> Sheet6 { get; set; }
    public List<Sheet_7_VM> Sheet7 { get; set; }
    public List<Sheet_8_VM> Sheet8 { get; set; }
    public List<Sheet_9_VM> Sheet9 { get; set; }
}

java脚本很简单,但如何在c#?

中实现这一点您的问题中有些地方没有意义:

  • 您的属性称为
    Sheet1
    Sheet2
    等,但您正试图使用反射访问名为
    Sheet\u 1\u VM
    Sheet\u 2\u VM
    等的属性
  • 您说可以将
    此页面对象
    强制转换为
    列表
    ,但这是不可能的
  • 您说“这里的percent属性指的是接口本身”,但这是不可能的<代码>项目。百分比具有类型<代码>浮动,不能引用接口
  • 然而,我们可以忽略这些问题,并跳到核心问题:给定一个对象,它可能是
    列表
    列表
    ,其中
    Sheet_1_VM
    Sheet_2_VM
    都实现
    IPercent
    ,我们如何迭代列表中的每个元素

    无法将
    列表
    强制转换为
    列表
    的原因是
    列表
    不是协变的。
    List
    是只包含
    Sheet\u 1\u VM
    对象(或其子类)的列表:您无法将
    Sheet\u 2\u VM
    放入
    列表中。但是,如果您假装您的
    列表
    是一个
    列表
    ,那么您可以将实现了
    IPercent
    的任何对象放入其中(通过调用
    List.Add
    )。这意味着您可以将
    工作表\u 2\u VM
    放入
    列表中,这显然毫无意义

    但是,
    List
    实现了
    IEnumerable
    ,并且
    IEnumerable
    是协变的。这意味着它只允许您从集合中取出项目,而不允许您将其放入(没有
    Add
    方法)。因此,将
    列表
    视为
    IEnumerable
    ,是安全的,因为任何人都不会将
    工作表放入其中

    我们可以这样写:

    public interface IPercent
    {
        float Percent { get; }
    }
    
    public class Sheet_1_VM : IPercent
    {
        public float Percent { get; set; }
    }
    
    public class Sheet_2_VM : IPercent
    {
        public float Percent { get; set; }
    }
    
    public class ModelOfExcel_VM : Object
    {
        public List<Sheet_1_VM> Sheet1 { get; set; }
        public List<Sheet_2_VM> Sheet2 { get; set; }
    }
    
    public static class Program
    {
        public static void Main()
        {
            var model = new ModelOfExcel_VM()
            {
                Sheet1 = new List<Sheet_1_VM>()
                {
                    new Sheet_1_VM() { Percent = 1.0f },
                    new Sheet_1_VM() { Percent = 2.0f },
                },
                Sheet2 = new List<Sheet_2_VM>()
                {
                    new Sheet_2_VM() { Percent = 3.0f },
                    new Sheet_2_VM() { Percent = 4.0f },
                },
            };
    
            var pageswithpercent = new List<string>() { "1", "2" }; 
    
            foreach (var page in pageswithpercent)
            {
                var thisPage = (IEnumerable<IPercent>)model.GetType().GetProperty("Sheet" + page).GetValue(model);
    
                foreach (var item in thisPage)
                {
                    Console.WriteLine(item.Percent);
                }
    
            }
        }
    }
    
    IPercent公共接口
    {
    浮动百分比{get;}
    }
    公共课程表\u 1\u VM:IPercent
    {
    公共浮动百分比{get;set;}
    }
    公共课程表\u 2\u VM:IPercent
    {
    公共浮动百分比{get;set;}
    }
    Excel_VM的公共类模型:对象
    {
    公共列表Sheet1{get;set;}
    公共列表Sheet2{get;set;}
    }
    公共静态类程序
    {
    公共静态void Main()
    {
    var模型=Excel_VM()的新模型
    {
    Sheet1=新列表()
    {
    新工作表\u 1\u VM(){Percent=1.0f},
    新工作表_1_VM(){Percent=2.0f},
    },
    Sheet2=新列表()
    {
    新工作表_2_VM(){Percent=3.0f},
    新工作表_2_VM(){Percent=4.0f},
    },
    };
    var pageswithpercent=新列表(){“1”,“2”};
    foreach(页面中的var页面百分比)
    {
    var thisPage=(IEnumerable)model.GetType().GetProperty(“工作表”+page).GetValue(模型);
    foreach(此页面中的变量项)
    {
    控制台写入线(项目百分比);
    }
    }
    }
    }
    
    关于你的问题,有些事情没有意义:

  • 您的属性称为
    Sheet1
    Sheet2
    等,但您正试图使用反射访问名为
    Sheet\u 1\u VM
    Sheet\u 2\u VM
    等的属性
  • 您说可以将
    此页面对象
    强制转换为
    列表
    ,但这是不可能的
  • 您说“这里的percent属性指的是接口本身”,但这是不可能的<代码>项目。百分比
  • 具有类型<代码>浮动
    ,不能引用接口 然而,我们可以忽略这些问题,并跳到核心问题:给定一个对象,它可能是
    列表
    列表
    ,其中
    Sheet_1_VM
    Sheet_2_VM
    都实现
    IPercent
    ,我们如何迭代列表中的每个元素

    无法将
    列表
    强制转换为
    列表
    的原因是
    列表
    不是协变的。
    List
    是只包含
    Sheet\u 1\u VM
    对象(或其子类)的列表:您无法将
    Sheet\u 2\u VM
    放入
    列表中。但是,如果您假装您的
    列表
    是一个
    列表
    ,那么您可以将实现了
    IPercent
    的任何对象放入其中(通过调用
    List.Add
    )。这意味着您可以将
    工作表\u 2\u VM
    放入
    列表中,这显然毫无意义

    但是,
    List
    实现了
    IEnumerable
    ,并且
    IEnumerable
    是协变的。这意味着它只允许您从集合中取出项目,而不允许您将其放入(没有
    Add
    方法)。因此,将
    列表
    视为
    IEnumerable
    ,是安全的,因为任何人都不会将
    工作表放入其中

    我们可以这样写:

    public interface IPercent
    {
        float Percent { get; }
    }
    
    public class Sheet_1_VM : IPercent
    {
        public float Percent { get; set; }
    }
    
    public class Sheet_2_VM : IPercent
    {
        public float Percent { get; set; }
    }
    
    public class ModelOfExcel_VM : Object
    {
        public List<Sheet_1_VM> Sheet1 { get; set; }
        public List<Sheet_2_VM> Sheet2 { get; set; }
    }
    
    public static class Program
    {
        public static void Main()
        {
            var model = new ModelOfExcel_VM()
            {
                Sheet1 = new List<Sheet_1_VM>()
                {
                    new Sheet_1_VM() { Percent = 1.0f },
                    new Sheet_1_VM() { Percent = 2.0f },
                },
                Sheet2 = new List<Sheet_2_VM>()
                {
                    new Sheet_2_VM() { Percent = 3.0f },
                    new Sheet_2_VM() { Percent = 4.0f },
                },
            };
    
            var pageswithpercent = new List<string>() { "1", "2" }; 
    
            foreach (var page in pageswithpercent)
            {
                var thisPage = (IEnumerable<IPercent>)model.GetType().GetProperty("Sheet" + page).GetValue(model);
    
                foreach (var item in thisPage)
                {
                    Console.WriteLine(item.Percent);
                }
    
            }
        }
    }
    
    IPercent公共接口
    {
    浮动百分比{get;}
    }
    公共课程表\u 1\u VM:IPercent
    {
    公共浮动百分比{get;set;}
    }
    公共课程表\u 2\u VM:IPercent
    {
    公共浮动百分比{get;set;}
    }
    Excel_VM的公共类模型:对象
    {
    公开名单
    
    public interface IPercent
    {
        float Percent { get; }
    }
    
    public class Sheet_1_VM : IPercent
    {
        public float Percent { get; set; }
    }
    
    public class Sheet_2_VM : IPercent
    {
        public float Percent { get; set; }
    }
    
    public class ModelOfExcel_VM : Object
    {
        public List<Sheet_1_VM> Sheet1 { get; set; }
        public List<Sheet_2_VM> Sheet2 { get; set; }
    }
    
    public static class Program
    {
        public static void Main()
        {
            var model = new ModelOfExcel_VM()
            {
                Sheet1 = new List<Sheet_1_VM>()
                {
                    new Sheet_1_VM() { Percent = 1.0f },
                    new Sheet_1_VM() { Percent = 2.0f },
                },
                Sheet2 = new List<Sheet_2_VM>()
                {
                    new Sheet_2_VM() { Percent = 3.0f },
                    new Sheet_2_VM() { Percent = 4.0f },
                },
            };
    
            var pageswithpercent = new List<string>() { "1", "2" }; 
    
            foreach (var page in pageswithpercent)
            {
                var thisPage = (IEnumerable<IPercent>)model.GetType().GetProperty("Sheet" + page).GetValue(model);
    
                foreach (var item in thisPage)
                {
                    Console.WriteLine(item.Percent);
                }
    
            }
        }
    }