gpt4 book ai didi

c# - C# 中动态对象的转换是如何工作的

转载 作者:行者123 更新时间:2023-11-30 14:48:29 29 4
gpt4 key购买 nike

我在 DocumentDB 文档中找到了这段代码:

https://github.com/Azure/azure-documentdb-dotnet/blob/master/samples/code-samples/DocumentManagement/Program.cs#L173

SalesOrder readOrder = (SalesOrder)(dynamic)response.Resource;

有人可以向我解释一下 C# 如何知道如何将动态对象转换为 SalesOrder 类的对象吗?我尝试过这种天真的方法,但它不起作用:

class SampleClass { public string Name { get; set; } }

object o = new { Name = "test" };
SampleClass casted = (SampleClass)(dynamic)o; // this won't work

我需要做什么才能允许以与链接示例中相同的方式进行转换?

最佳答案

你的代码...

object o = new { Name = "test" };
SampleClass casted = (SampleClass)(dynamic)o; // this won't work

...不起作用,不是因为中间转换为 dynamic,而是因为匿名类和 SampleClass 之间的类型不匹配。

不要将动态与匿名类混淆。没有dynamic类型的对象,主要是just there for the compiler 。另一方面,匿名类是编译时存在的完整类型安全类。与非匿名类没有什么区别,只是你不知道名称。编译器将在底层创建完整的类定义(使用反编译器检查)。

这也是您的作业的问题。您正在尝试将匿名类的对象分配给 SampleClass 类型的变量。这是行不通的(而且它们共享 Name 属性并不重要)。您也可以尝试分配 stringint 或任何其他类型(SampleClass 除外),结果将完全相同。

始终记住 C# 是强类型的。在像 JavaScript 这样的弱类型语言中,你的作业是可行的。在 C# 中并非如此。

更新(使用问题评论中的信息):

你的任务...

SalesOrder readOrder = (SalesOrder)(dynamic)response.Resource;

...在一个重要方面有所不同。转换后的类型实现 IDynamicMetaObjectProvider 接口(interface)。转换为dynamic 使编译器能够识别该接口(interface)。然后,它可以注入(inject)代码以使用该接口(interface)转换为 SalesOrder。它将产生完全不同的代码,该代码将对源对象执行动态运行时转换,与常规类型转换无关。

关于c# - C# 中动态对象的转换是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41442512/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com