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
等的属性此页面对象
强制转换为列表
,但这是不可能的列表
或列表
,其中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);
}
}
}
}