3

我意识到它违背了 C# 的强类型特性,但我发现在使用该语言中的动态对象时,JavaScript 或 PowerShell 中常见的一些更有用的功能根本不实用。

例如,以下 C# 代码将在运行时失败,原因很明显。

dynamic x = 1.0;
int y = x;

但这使得 C# 的动态特性在处理松散类型的数据时非常有限,例如由 JSON 有效负载或 CSV 生成的数据,其中表示的细微变化可能导致运行时的行为非常不同。

我正在寻找的是与 VBA / VBScript 时代Variant类型非常相似的东西。我想有可能从中派生出这样的类型DynamicObject,它将包装原始值,如Int32,String等,并在运行时执行适当的强制转换。在动态上下文中对“null”值做了类似的事情。

但是这样的东西已经建立了吗?我环顾 GitHub 或 Codeplex 无济于事,但搜索起来有点困难。在我开始我想象的将是一个相当复杂的课程之前,我想确保我没有浪费我的时间。

关于这一切的实用性

我应该注意,我很长一段时间都反对 C# 中动态调度的概念,因为它不是一种动态语言。老实说,我希望它根本不被添加到语言中,或者至少仅限于 COM 互操作场景。

但是话虽如此,我总是对如何“破解”语言功能以使它们做他们从未打算做的事情感到好奇。有时会从中产生一些有用的东西。例如,已经有很多人使用IDisposable接口和using语句来做与释放资源无关的事情的例子。

我怀疑我会在生产应用程序或任何需要交给其他开发人员的东西中使用它。

4

1 回答 1

4

Visual Basic 语言隐藏了很多胶水,这不是 C# 的方式。Variant 类型有大量的转换函数,它们由 vb 运行时自动调用。.NET 也有自动转换功能,你只需要明确地使用它们:

dynamic x = 1.0;
int y = Convert.Int32(x);

C# 有理由编写这样的代码,因为它不是一种隐藏成本的语言。

于 2012-05-25T19:16:30.413 回答