Я понимаю, что на это ответили, но я использовал другой подход и подумал, что стоит поделиться.Кроме того, я чувствую, что мой подход может привести к нежелательным накладным расходам.Тем не менее, я не могу наблюдать или рассчитывать что-либо, что так плохо под нагрузками, которые мы наблюдаем.Я искал какие-либо полезные отзывы об этом подходе.
Проблема работы с динамикой заключается в том, что вы не можете напрямую прикрепить какие-либо функции к динамическому объекту.Вы должны использовать что-то, что может выяснить назначения, которые вы не хотите вычислять каждый раз.
При планировании этого простого решения я смотрел, каковы действительные посредники при попытке повторно напечатать подобные объекты.Я обнаружил, что обычные подходы - это двоичный массив, строка (xml, json) или жесткое кодирование преобразования ( IConvertable ).Я не хочу вдаваться в двоичные преобразования из-за фактора поддерживаемости кода и лени.
Моя теория состояла в том, что Newtonsoft может сделать это с помощью строкового посредника.
Как недостаток, я вполне уверен, что при преобразовании строки в объект будет использоваться отражение путем поиска в текущей сборке объекта с совпадающими свойствами, создания типа, а затем создания экземпляров свойств, что потребует большего отражения.Если это правда, все это можно считать ненужными.
C #:
//This lives in a helper class
public static ConvertDynamic<T>(dynamic data)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(Newtonsoft.Json.JsonConvert.SerializeObject(data));
}
//Same helper, but in an extension class (public static class),
//but could be in a base class also.
public static ToModelList<T>(this List<dynamic> list)
{
List<T> retList = new List<T>();
foreach(dynamic d in list)
{
retList.Add(ConvertDynamic<T>(d));
}
}
С учетом сказанного, это подходит для другой утилиты, которую я собрал, которая позволяет мне превращать любой объект вдинамичный.Я знаю, что мне пришлось использовать отражение, чтобы сделать это правильно:
public static dynamic ToDynamic(this object value)
{
IDictionary<string, object> expando = new ExpandoObject();
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType()))
expando.Add(property.Name, property.GetValue(value));
return expando as ExpandoObject;
}
Я должен был предложить эту функцию.Произвольный объект, назначенный динамически типизированной переменной, не может быть преобразован в IDictionary и нарушит функцию ConvertDynamic.Для использования этой цепочки функций необходимо предоставить динамику System.Dynamic.ExpandoObject или IDictionary.