Мне нужно сопоставить общий список значений ключа с моим классом модели.
Ниже представлен класс KeyValues
.
public class KeyValues
{
public string Key { get; }
public string Value { get; set; }
}
Получение этого в качестве ввода в IList<KeyValues>
со значениями ниже
Key = "SystemId"
Value = "12"
Key = "SystemName"
Value = "LTPVBN21"
Key = "Location"
Value = "NJ2"
Я хочу сопоставить это со свойствами класса SystemInformation
ниже. На основе ключа необходимо установить значение в соответствующем свойстве.
public class SystemInformation
{
public string SystemId { get; set; }
public string SystemName { get; set; }
public string Location { get; set; }
}
Прямо сейчас я зацикливаю объект IList<KeyValues
> и устанавливаю значения в модели, сравнивая ключ.
Есть ли другой способ добиться этого с помощью Automapper или любого другого варианта, поскольку я должен проделать аналогичную операцию для нескольких моделей.
Может это помогает?
Проверьте документы.
Для этого вам нужно использовать отражение, и это будет примерно так:
SystemInformation information = new SystemInformation();
foreach(var item in values)
{
information.GetType()
.GetProperty(item.Key)
.SetValue(information, item.Value);
}
Смотрите рабочий ДЕМО рабочий пример.
Я использую специально объект Системная информация, но это может быть что угодно, и вы можете вызвать GetType()
, чтобы получить сведения о типе, а затем продолжить, вызвав методы отражения.
Надеюсь, поможет.
using System.Collections.Generic;
using System.Reflection;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
List<KeyValues> kv = new List<KeyValues>();
kv.Add(new KeyValues() { Key = "SystemId", Value = "12" });
kv.Add(new KeyValues() { Key = "SystemName", Value = "LTPVBN21" });
kv.Add(new KeyValues() { Key = "Location", Value = "NJ2" });
SystemInformation si = new SystemInformation();
foreach (KeyValues k in kv)
{
PropertyInfo pi = typeof(SystemInformation).GetProperty(k.Key);
pi.SetValue(si, k.Value);
}
}
public class KeyValues
{
public string Key { get; set; }
public string Value { get; set; }
}
public class SystemInformation
{
public string SystemId { get; set; }
public string SystemName { get; set; }
public string Location { get; set; }
}
}
}
Не получайте dv на этот ответ. это совершенно верно
Без разницы, выручил Даса рабочим примером. Скопировал и еще не видел вашего ответа
Я думаю, вы неправильно поняли. Я не голосовал против вас (на самом деле я голосовал за то, чтобы отменить его), и мне не нужно отвечать, это совершенно хороший вопрос, как и другой аналогичный.
Вы можете использовать отражение, если вам нужно более общее решение