Посмотрите, поможет ли это.
//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();
Стратегия здесь такая.
dataDump.Keys.Contains(p.Name)
вернет true
, если содержится имя свойства p
в словаре dataDump
в качестве ключа. var val = dataDump[p.Name]
извлекает значение из p.Name
в словаре dataDump
и присваивает его временной переменной val
.Это только для ясности.Вы можете уменьшить это значение. 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