Я понимаю, что на это был дан ответ, но я использовал другой подход и думал, что это может стоить обмена. Кроме того, я чувствую, что мой подход может вызвать нежелательные накладные расходы. Тем не менее, я не могу наблюдать или подсчитывать что-либо, что происходит, что плохо при нагрузках, которые мы наблюдаем. Я искал любую полезную обратную связь по этому подходу.
Проблема с динамикой заключается в том, что вы не можете напрямую подключать любые функции к динамическому объекту. Вы должны использовать что-то, что может определить назначения, которые вы не хотите анализировать каждый раз.
При планировании этого простого решения я посмотрел, какие действительные посредники при попытке перепечатать похожие объекты. Я обнаружил, что двоичный массив, строка (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 <, объект >.
Вы говорите, что вам нужно динамически вызывать неявный или явный оператор преобразования? – Gabe
либо один, но на данный момент, явный –