动态转换 Microsoft.Azure.Documents 如何导致反序列化?

JSO*_*ody 4 c# casting dynamic deserialization azure-cosmosdb

我的团队获得了一个示例文件,该文件演示了如何在 C# 中与 CosmosDB 交互并将生成的Microsoft.Azure.Document实例转换为 POCO。文档的转换如下:(省略号表示为了简洁而省略的逻辑)

public Task<T> GetItemAsync<T> (...)
{

    Document document = await client.ReadDocumentAsync(...);
    return (T)(dynamic)document;

}
Run Code Online (Sandbox Code Playgroud)

在我看来,以(dynamic)document某种方式序列化文档,否则需要通过单独指定每个 JSON 字段来完成。考虑到dynamic强制转换操作如何不能重载,我不知道是什么导致了这种反序列化的发生。

我忽略了什么阻碍我理解这个操作?

Nko*_*osi 5

对于幕后实际发生的事情存在误解。

首先一些背景

ReadDocumentAsync返回一个DocumentResponse<Document>包装了Document包含读取资源记录的a。

DocumentResponse<Document>反过来有一个implicit operator允许它被转换/转换为Document

因此

Document item = await client.ReadDocumentAsync<T>(...);
//replaced var for to Document for demonstrative purposes.
Run Code Online (Sandbox Code Playgroud)

Document源自IDynamicMetaObjectProvider

public class Document : Microsoft.Azure.Documents.Resource, System.Dynamic.IDynamicMetaObjectProvider

// Inheritance: Object --> JsonSerializable --> Resource --> Document
// Implements: IDynamicMetaObjectProvider
Run Code Online (Sandbox Code Playgroud)

表示一个动态对象,可以在运行时绑定其操作

埃普马西斯矿井

正是因为IDynamicMetaObjectProvider,它首先被转换为dynamic所需的类型,然后再转换为所需的类型。

在幕后,动态资源对象将尝试将已解析文档的包含成员绑定到目标强类型对象的成员。

使您不必尝试自己为所需类型编写显式转换。

您也可以按照另一个答案中的建议使用通用重载。