使用属性索引C#添加到列表属性

时间:2016-09-12 12:21:26

标签: c# list

我想使用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;
    }
}

这不起作用。任何建议表示赞赏

4 个答案:

答案 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个属性,可以随意访问和应用值。