2017-06-24 110 views
0

讓我解釋一下,我有一個模型列表,其中有一千多個參數,所以我必須填寫一些變量列表,事情是我不想這樣做:C#將元素添加到對象列表使用變量作爲列表鍵

   list.Add(new Model{ 
        name1= value, 
        name2= value, 
        ..... 
        name1000=value 
        }); 

我有一個包含在列表中的參數名稱的數組,所以我想知道是否可以使用名稱的數組,並在循環獲取變量填充,如下所示:

   list.Add(new Model{ 
        //a loop? 
        array[0]= value 
        }); 

謝謝。

+4

擁有1000個變量的模型可能表明代碼沒有被優雅地設計...... –

回答

0

您可以使用反射來實現此目的。下面

public class ModelFactory 
{ 
    private IDictionary<string, PropertyInfo> propertiesInfo { get; set; } 

    public ModelFactory() 
    { 
     this.propertiesInfo = typeof(Model) 
          .GetProperties() 
          .ToDictionary(p => p.Name, p => p); 
    } 

    public Model Create(string[] propertiesToInitialize, dynamic value) 
    { 
     var model = new Model(); 
     foreach (var propertyName in propertiesToInitialize) 
     { 
      if (this.propertiesInfo.ContainsKey(propertyName)) 
      { 
       var property = this.propertiesInfo[propertyName]; 
       property.SetValue(model, value); 
      } 
     } 

     return model; 
    } 
} 

型號代碼初始化

public class Model 
{ 
    public int MyProperty1 { get; set; } 

    public int MyProperty2 { get; set; } 

    public int MyProperty3 { get; set; } 

    public int MyProperty4 { get; set; } 

    public int MyProperty5 { get; set; } 
} 

使用

public void Test() 
{ 
    var propertiesToInitialize = new string[] { "MyProperty1", "MyProperty2", "MyProperty4" }; 
    var modelFactory = new ModelFactory(); 

    var list = new List<Model>(); 

    list.Add(modelFactory.Create(propertiesToInitialize, 500)); 

    Console.WriteLine("MyProperty1 " + list[0].MyProperty1); // 500 
    Console.WriteLine("MyProperty2 " + list[0].MyProperty2); // 500 
    Console.WriteLine("MyProperty3 " + list[0].MyProperty3); // 0 
    Console.WriteLine("MyProperty4 " + list[0].MyProperty4); // 500 
    Console.WriteLine("MyProperty5 " + list[0].MyProperty5); // 0 
} 

然而,由於已經在評論中提到的,請重新考慮你的模型設計,因爲這些衆多屬性模特是不是最佳的。

+0

這裏的動態點是什麼? – MistyK

+0

@MistyK在這個例子中沒有動態的好處。最初我正在考慮將IDictionary PropertyValueToInit作爲參數...以便用戶可以初始化不同的值。這只是一個示例代碼。 – Kaushal