我想使用foreach循环添加到c#列表而不使用列表属性键名。
我有一个列表,例如
public class Bus
{
public string Val1 { get; set; }
public string Val2 { get; set; }
public string Val3 { get; set; }
public string Val4 { get; set; }
public string Val5 { get; set; }
public string Val6 { get; set; }
// ...
public string Val127 { get; set; }
}
我想填充的列表可以有200多个属性,所以我试图找到一种快速填充它们而不写出属性的方法。 我想使用类似这样的东西从一维数组(线)填充这个
j = 0
for (int i = 0; i < lines.Length; i++)
{
foreach(Bus BusProp in BusList)
{
BusProp[j] = line[i+j];
j =+ 1;
}
}
这不起作用。任何建议表示赞赏
答案 0 :(得分:1)
为什么不使用
//break the transaction of batches of 20 items
var idArrays = splitArray(Object.keys(cart.lines), 20),
transaction = { id: order.id };
angular.forEach(idArrays, function(ids){
angular.forEach(ids, function (id) {
var analyticsLine = analyticsCart(cart.lines[id]);
ga('ec:addProduct', analyticsLine);
});
// connect the batch to the transaction
ga('ec:setAction', 'purchase', transaction);
ga('send', 'event', 'Checkout', 'Purchase', 'items batch');
});
//Send the transaction total data
var fullTransaction = {
id: order.id,
tax: cart.tax,
shipping: cart.deliveryCost
};
ga('ec:setAction', 'purchase', fullTransaction);
ga('send', 'event', 'Checkout', 'Purchase', 'transaction details');
答案 1 :(得分:1)
如果您无法更改班级定义,则您的主要选择是使用反射。
void Main()
{
var bus = new Bus();
var data = new string[6] { "A", "B", "C", "D", "E", "F" };
for (var i = 1; i <= 6; i++)
{
bus.GetType().GetProperty("Val" + i.ToString()).SetValue(bus, data[i - 1]);
}
Console.WriteLine(bus.Val5); // E
}
public class Bus
{
public string Val1 {get;set;}
public string Val2 {get;set;}
public string Val3 {get;set;}
public string Val4 {get;set;}
public string Val5 {get;set;}
public string Val6 {get;set;}
}
毋庸置疑,这是非常昂贵的,可能很难维护。在使用此选项之前,请确保您没有更合理的选项(例如,使用代码生成更改类以包含数组而不是索引属性...)。
即使你的数据库有150个索引列的类似COBOL的怪物,也不应该是你的应用程序无法以Item[34]
而不是{Item34
的形式处理它们的原因。 {1}} - 将应用程序代码与您不满意的固定约束隔离开来。
答案 2 :(得分:0)
试试这个
var typ = typeof(Bus);
var prop = typ.GetProperty($“Val {j}”);
答案 3 :(得分:0)
我觉得到目前为止的答案还没有满足你的需求,因此这是我的解决方案:
static void Main(string[] args)
{
//Create a string array containing the desired property names, in this case I'll use a loop
List<string> DesiredProperties = new List<string>();
for (int i = 0; i < 100; i++)
{
DesiredProperties.Add(string.Format("Property{0}", i));
}
//Call the method that returns the object and pass the array as parameter
var Bus = CreateDynamicObject(DesiredProperties);
//Display one of the properties
Console.WriteLine(Bus.Property99);
Console.Read();
}
private static dynamic CreateDynamicObject(List<string> PropertyList)
{
dynamic obj = new System.Dynamic.ExpandoObject();
foreach (string Prop in PropertyList)
{
//You can add the properties using a dictionary. You can also give them an initial value
var dict = (IDictionary<string, object>)obj;
dict.Add(Prop, string.Format("The value of {0}", Prop));
}
return obj;
}
这段代码将为var“Bus”添加100个属性,可以随意访问和应用值。