2017-04-18 13 views
0

TEntityはGeneric BaseClassであり、BaseClass LocationEntityおよびZoneEntityから派生した2つのクラスがあります。返されたドキュメントをDocumentDBから厳密な型チェックを使用してC#クラスに変換します

以下はLocationEntityですが、response.ResourceZoneEntityのオブジェクトを返しています。 TEntityにDocuementDB Documentを変換しながら、厳密な型チェックを実行する方法

 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; 
    } 

response.ResourceのタイプがLocationEntityでない場合、例外などを投げたいです。

+0

'ReadDocumentAsync'は' ResourceResponse 'を返します。あなたのクラスは 'Document'から継承していると思いますか?もしそうなら、なぜあなたは 'TEntity'にジェネリック制約を使用していませんか?いずれにしても、その「動的な」キャストは外れて見える。代わりに 'is TEntity'や' as TEntity'を使うことはできませんか?また、 'throw ex;'は例外のスタックトレースを保持しないことに注意してください - 'throw;'は例外です。 –

+0

私はDocumentから継承していません。 readObj = response.TEntityがnullを返すときのリソース。元情報をありがとう。 – JerryGoyal

+0

次に、 'ReadDocumentAsync'がどのようなドキュメントを返すのか、そしてそれを通常' LocationEntity'にどのように変換しますか? 「動的」にキャストを追加してからターゲットタイプにキャストを追加するだけで、魔法のように動作することはありません。 –

答えて

1

LocationEntityのいくつかの固有のプロパティを[JsonProperty(Required = Required.Always)]で、ZoneEntityプロパティでも飾ってしまいました。
readObj = (TEntity) (dynamic) response.Resource;は、プロパティが存在しない場合はエラーをスローします。

これは私が考えた方法ですが、まだまだ良い方法を望んでいます。

関連する問題