Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Преобразование возвращенного документа из DocumentDB в класс C# со строгой проверкой типов

Автор вопроса: GorvGoylОтветов: 1

TEntity - это Generic BaseClass, и есть два класса, производных от BaseClass LocationEntity и ZoneEntity.

Ниже GetById() имеет контекст LocationEntity, но response.Resource возвращает объект ZoneEntity.

      public async Task<TEntity> GetById(string id)
    {
        TEntity readObj = null;
        try
        {
            var response = await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(dbName, collectionName, id),
                requestOptions);
            readObj = (TEntity) (dynamic) response.Resource; // it's ignoring the properties which does not match with TEntity (LocationEntity)
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return readObj;
    }

Как выполнить строгую проверку типов при преобразовании DocumentDB Document в TEntity?

Я хочу создать исключение или что-то в этом роде, когда response.Resource не относится к типу LocationEntity.

  • ReadDocumentAsync возвращает ResourceResponse<Document>. Я предполагаю, что ваши классы наследуются от Document? Если да, то почему вы не используете общее ограничение для TEntity? В любом случае, этот состав dynamic выглядит неуместно. Разве вы не можете вместо этого использовать конструкцию is TEntity или as TEntity? Также обратите внимание, что throw ex; не сохраняет трассировку стека исключения, а throw; сохраняет. Pieter Witvoet 18.04.2017
  • Я не наследую от Document. Никогда не чувствовал необходимости. readObj = response.Resource, поскольку TEntity дает значение null. Спасибо за информацию об экс. GorvGoyl 18.04.2017
  • Тогда какой документ возвращает ReadDocumentAsync и как вы обычно конвертируете его в LocationEntity? Простое добавление приведения к dynamic, а затем к вашему целевому типу волшебным образом не сработает... Pieter Witvoet 18.04.2017
  • @PieterWitvoet Это происходит. класс, вызывающий этот класс (GetById), передает LocationEntity. GorvGoyl 18.04.2017
  • Я понимаю, что вы называете это GetById<LocationEntity>(...), но я спрашиваю: как бы вы обычно (без дженериков) конвертировали Document в LocationEntity? Pieter Witvoet 18.04.2017
  • см. второй ответ stackoverflow.com/questions/27118998 / Я делаю так LocationEntity location = await _unitOfWork.LocationRepository.GetById(locationId.ToString()); GorvGoyl 18.04.2017

genericsazure-cosmosdbserialization

Ответы

Ответ 1 · рейтинг 1 · GorvGoyl

В итоге я украсил некоторые уникальные свойства LocationEntity свойствами [JsonProperty(Required = Required.Always)] и такими же свойствами ZoneEntity.
Теперь readObj = (TEntity) (dynamic) response.Resource; выдает ошибку, если свойства нет.

Это один из способов, который я понял, но все еще надеюсь на лучший способ.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы