проверьте, соответствует ли каждый «ключ» в словаре свойству модели, и сопоставьте значение словаря (C #) - PullRequest
0 голосов
/ 24 мая 2018

У меня есть словарь с именем dataDump.

У меня есть модель с именем model.

В конечном счете, я хочу сопоставить значения, хранящиеся в dataDump, со свойствами модели.Свойства dataDump будут меняться в зависимости от ввода пользователя, поэтому я бы хотел, чтобы они отображались «разумно», а не отображали каждое свойство вручную.

У меня есть основы кода, но я не уверен, какчтобы закончить это.

//put the model's properties into an array.

Type type = model.GetType();

PropertyInfo[] properties = type.GetProperties();



//loop through the array of model's properties.

foreach (PropertyInfo property in properties)
{

    //if the current property == a property in dataDump

    //model.property = the value of the matched dataDump property

}

1 Ответ

0 голосов
/ 24 мая 2018

Посмотрите, поможет ли это.

//Assuming your dataDump is something like follows.
var dataDump = new Dictionary<string, string>();
dataDump.Add("Property1", "Value1");
dataDump.Add("Property2", "Value2");
dataDump.Add("Property3", "Value3");


Model m = new Model();
var properties = m.GetType().GetProperties();
foreach(var p in properties){
    if (dataDump.Keys.Contains(p.Name)) { 
        var val = dataDump[p.Name];
        p.SetValue(m, val);
    }
}
 //These are for the verification purpose
Console.WriteLine(m.Property1);
Console.WriteLine(m.Property3);
Console.ReadLine();

Стратегия здесь такая.

  1. dataDump.Keys.Contains(p.Name) вернет true, если содержится имя свойства pв словаре dataDump в качестве ключа.
  2. var val = dataDump[p.Name] извлекает значение из p.Name в словаре dataDump и присваивает его временной переменной val.Это только для ясности.Вы можете уменьшить это значение.
  3. p.SetValue(m, val) устанавливает значение val для свойства с именем p.Name в объекте модели m.

EDIT Предложено Тициан Черникова-Драгомир

foreach(var p in properties){
    string val;
    if (dataDump.TryGetValue(p.Name, out val)) { 
        p.SetValue(m, val);
    }
}

еще лучше.Это позволяет избежать двойного поиска в dataDump.

EDIT , добавленном для полноты информации.

Этого также легко достичь, используя Enumerable Methods для LInQ, следующим образом.Как вы можете видеть, это упрощает код в очень короткое выражение, в отличие от ранее.

var properties = m.GetType().GetProperties();
properties
    .Where(p => dataDump.Keys.Contains(p.Name)) // Finds the matching keys from the dictionary
    .ToList() // Converts the reduced array into a list
    .ForEach(x => x.SetValue(m, dataDump[x.Name])); // For each of the elements in the list, set the value of m from the dataDump
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...