20

我有以下代码调用 DocumentDB 并创建一个新的员工文档。然后如何将结果再次转换为员工文档?基本上,我想捕获创建的文档并将其转换为 Employee 对象。

var result = await client.CreateDocumentAsync(collection.SelfLink, employee);

if(result.StatusCode == System.Net.HttpStatusCode.Created)
{
   Employee emp = result.Resource; // How do I convert the result to Employee object here?
}
4

4 回答 4

48

您可以像这样进行动态转换:

Employee emp = (dynamic)result.Resource;

于 2014-12-04T07:00:28.513 回答
8

我写了一个扩展方法来做到这一点:

public static async Task<T> ReadAsAsync<T>(this Document d)
{
    using (var ms = new MemoryStream())
    using (var reader = new StreamReader(ms))
    {
        d.SaveTo(ms);
        ms.Position = 0;
        return JsonConvert.DeserializeObject<T>(await reader.ReadToEndAsync());
    }
}

然后你可以像这样使用它

Document d;
var myObj = await d.ReadAsAsync<MyObject>();
于 2017-11-08T19:59:52.893 回答
7

(复制 Andrew Davis 的答案,来自DocumentDB MSDN 论坛,用于 stackoverflow 社区)

最简单的方法是让您的 Employee 类继承自 Document,然后将 result.Resource 转换为 Employee。如果您不想从 Document 继承,您还可以在 Document 和 Employee 之间定义显式转换。

如果 Employee 类的成员名称与 JSON 表示的相应属性的名称匹配,则从 Document 继承的 Employee 类应该是开箱即用的。

定义你自己的类型转换给你更多的控制,可能看起来像这样:

public static explicit operator Employee(Document doc)
{
    Employee emp = new Employee();
    emp.Name = doc.GetPropertyValue<string>("employeeName");
    emp.Number = doc.GetPropertyValue<int>("employeeNumber");
    /* and so on, for all the properties of Employee */
    return emp;
}

这将定义从 Document 到 Employee 的显式转换。您必须确保 GetPropertyValue 字符串(和类型参数)与您的 JSON 属性匹配。

于 2014-11-25T23:36:18.113 回答
1

这是一个同步扩展方法,它不会像(dynamic)cast 方法那样默默地遗漏属性。使用最新的 .NET Core 功能 Span 和 System.Text.Json 来提高性能。

用法:

Document doc; // source Document
MyType converted = doc.ConvertTo<MyType>();

执行:

public static T ConvertTo<T>(this Document item)
{
    using var stream = new MemoryStream();
    item.SaveTo(stream);
    var bytes = new ReadOnlySpan<byte>(stream.GetBuffer()).Slice(0, (int)stream.Length);
    return JsonSerializer.Deserialize<T>(bytes);
}
于 2020-08-10T00:16:26.620 回答