Разрешите пояснить, у меня есть модельный список, в котором у меня чуть больше тысячи параметров, поэтому мне нужно заполнить список некоторыми переменными, дело в том, что я не хочу этого делать:

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

У меня есть массив, содержащий имена параметров в списке, поэтому мне было интересно, можно ли использовать этот массив имен и в цикле заполнить переменные, примерно так:

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

Спасибо.

0
elunap 24 Июн 2017 в 19:49
4
Наличие модели с 1000 переменными, вероятно, указывает на то, что код не разработан элегантно ...
 – 
Willem Van Onsem
24 Июн 2017 в 19:50

1 ответ

Лучший ответ

Вы можете добиться этого с помощью отражения. Код ниже

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
Kaushal 24 Июн 2017 в 20:21
В этом примере нет преимущества динамического. Первоначально я думал взять IDictionary PropertyValueToInit в качестве параметра ... чтобы пользователь мог инициализировать разные значения. Это просто образец кода.
 – 
Kaushal
24 Июн 2017 в 20:46