Я изо всех сил пытаюсь поместить свои строковые данные JSON в динамически сгенерированный класс, который теперь выдает ошибку, которую я не могу определить, как решить эту проблему.
Мой динамический класс
public class DynamicClass : DynamicObject
{
private Dictionary<string, KeyValuePair<Type, object>> _fields;
public DynamicClass(List<Field> fields)
{
_fields = new Dictionary<string, KeyValuePair<Type, object>>();
fields.ForEach(x => _fields.Add(x.FieldName,
new KeyValuePair<Type, object>(x.FieldType, null)));
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (_fields.ContainsKey(binder.Name))
{
var type = _fields[binder.Name].Key;
if (value.GetType() == type)
{
_fields[binder.Name] = new KeyValuePair<Type, object>(type, value);
return true;
}
else throw new Exception("Value " + value + " is not of type " + type.Name);
}
return false;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = _fields[binder.Name].Value;
return true;
}
}
private static List<Field> GenerateFields(List<SQL.Column> eColumns)
{
var Fields = new List<Field>();
foreach (SQL.Column col in eColumns)
{
try
{
var DataTypes = GetDataTypes();
var DataType = DataTypes.Where(x => x.Id == Convert.ToInt64(col.DataType)).First();
switch (DataType.Id)
{
case 1:
case 6:
{
Fields.Add(new Field(col.Name, typeof(string)));
break;
}
case 2:
{
Fields.Add(new Field(col.Name, typeof(DateTime)));
break;
}
case 3:
{
Fields.Add(new Field(col.Name, typeof(Guid)));
break;
}
case 4:
{
Fields.Add(new Field(col.Name, typeof(long)));
break;
}
case 5:
{
Fields.Add(new Field(col.Name, typeof(decimal)));
break;
}
case 7:
{
Fields.Add(new Field(col.Name, typeof(float)));
break;
}
case 8:
{
Fields.Add(new Field(col.Name, typeof(byte[])));
break;
}
case 9:
{
Fields.Add(new Field(col.Name, typeof(double)));
break;
}
case 10:
{
Fields.Add(new Field(col.Name, typeof(object)));
break;
}
case 11:
{
Fields.Add(new Field(col.Name, typeof(char)));
break;
}
case 12:
{
Fields.Add(new Field(col.Name, typeof(int)));
break;
}
default:
Fields.Add(new Field(col.Name, typeof(object)));
break;
}
}
catch (Exception e)
{
#region Error
ledger._base.Errors.Add(new Error
{
Message = "Something went wrong in connect Ledger to SuperNode, ledger will be unable to establish connection to system",
Sys_Message = e.Message,
Process = "ledger.data._base.GetSqlData",
Line = 38,
Priority = 1
});
#endregion
}
}
return Fields;
}
Пример данных: [{"Идентификатор":"1","Имя":"Тестовый продукт 001","Описание":"wehfwouhf","Количество":"12","Цена":"25","Детский" :""},{"Идентификатор":"2","Название":"название товара","Описание":"Объясните товар","Цена":8.34,"Количество":1,"Детский" :null},{"Id":"3","Имя":"название товара 002","Описание":"Объясните товар","Цена":8.34,"Количество":1,"Ребенок" :нулевой}]
DynamicClass dynamicClass = new DynamicClass(GenerateFields(eColumns));
var vReturn = JsonConvert.DeserializeObject<List<DynamicClass>>(retV);
Этот последний вызов выдает ошибку «Невозможно найти конструктор по умолчанию для использования для типа Ledger.data.DynamicClass. Путь '[0].Id', строка 1, позиция 7".
_fields = Количество = 6
Генерируемый класс
{[Id, [System.String, ]]}, {[Имя, [System.String, ]]}, {[Описание, [System.String, ]]}, {[Количество, [System.String, ]] } ,{[Цена, [System.String, ]]}, {[Дочерний элемент, [System.String, ]]}
Используемый класс
public class Field
{
public Field(string name, Type type)
{
this.FieldName = name;
this.FieldType = type;
}
public string FieldName;
public Type FieldType;
}
Я заметил, что возврат из динамически сгенерированного класса пропускает объект (Dictionary>), однако я предполагаю, что это должно быть фактическое значение JSON.
Может ли кто-нибудь пролить свет на это, почему я получаю эту ошибку?