Как упоминали другие люди, эта ситуация очень обычная и определенно требует контекста, чтобы решить ее с лучшей точки зрения, поскольку я подозреваю плохую архитектуру базы кода. Тем не менее, ваш вопрос остается в силе. Чтобы решить эту проблему, у вас есть как минимум две возможности:
1. Требуют времени на разработку; незначительное время выполнения. Просто создайте функцию, которая сопоставляет заданный словарь с экземпляром вашего класса. Пример:
Foo MapDictionaryToFoo(IReadOnlyDictionary<string, dynamic> d)
{
return new Foo
{
ID1 = d[nameof(Foo.ID1)],
ID2 = d[nameof(Foo.ID2)],
ID3 = d[nameof(Foo.ID3)]
};
}
Пример вызова:
Foo myFoo = MapDictionaryToFoo(myDictionary);
2. Требовать время выполнения; незначительное время разработки. Создайте функцию, которая сопоставляет данный словарь с произвольным классом, обычно используя Reflection. В приведенном ниже примере предполагается, что ваш класс имеет конструктор по умолчанию, поэтому он также действует как фабрика. Если это не так, существующий экземпляр можно передать в дополнительном параметре:
T CreateFromDictionary<T>(IReadOnlyDictionary<string, dynamic> d) where T : new()
{
T obj = new T();
foreach (var propertyInfo in typeof(T).GetProperties())
{
propertyInfo.SetValue(obj, d[propertyInfo.Name]);
}
return obj;
}
Пример вызова:
Foo myFoo = CreateFromDictionary<Foo>(myDictionary);
Если мне нужно выбрать один, я бы выбрал первый подход, поскольку я избегаю любого отражения, которое занимает много времени во время выполнения.
person
Jämes
schedule
17.06.2019