Динамический класс с DeserializeObject выдает ошибку: невозможно найти конструктор по умолчанию для использования для типа

Я изо всех сил пытаюсь поместить свои строковые данные 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.

Может ли кто-нибудь пролить свет на это, почему я получаю эту ошибку?


person Jaap Terlouw    schedule 07.01.2019    source источник
comment
попробуйте добавить конструктор, который задает словарь: public DynamicClass(Dictionary‹string, KeyValuePair‹Type, object›› fields) { _fields = fields; }   -  person user1519979    schedule 07.01.2019


Ответы (1)


По-видимому, вы получаете эту ошибку, если объект имеет нулевое значение, например, строка = null или любой объект. Решение на самом деле довольно простое... пустая трата 2 идеальных рабочих дней...... https://stackify.com/nullreferenceexception-object-reference-not-set/

person Jaap Terlouw    schedule 08.01.2019