我有以下代码调用DocumentDB并创建一个新的Employee文档。如何再将结果转换为Employee文档?基本上,我想捕获创建的文档并将其转换为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?
}
答案 0 :(得分:41)
你可以做这样的动态演员:
Employee emp = (dynamic)result.Resource;
答案 1 :(得分:7)
(复制Andrew Davis的答案,来自DocumentDB MSDN forums,对于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属性匹配。
答案 2 :(得分:4)
我写了一个扩展方法来执行此操作:
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>();
答案 3 :(得分:0)
这是一个同步扩展方法,不会像(dynamic)
强制转换方法那样默默地丢失属性。使用最新的.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);
}