我意识到它违背了C#的强类型特性,但我发现在使用该语言中的动态对象时,JavaScript或PowerShell中常见的一些更有用的功能根本就不实用。
例如,以下C#代码将在运行时失败,这显然是原因。
dynamic x = 1.0;
int y = x;
但这使得C#的动态特性在处理松散类型的数据时非常有限,例如由JSON有效负载或CSV生成的数据,其中表示中的细微变化可能导致在运行时出现非常不同的行为。
我正在寻找的东西与VBA / VBScript时代Variant
类似。我想可以从DynamicObject
派生这样一个类型来包装原始值,如Int32
,String
等,并在运行时执行适当的强制转换。 I've done something similar在动态上下文中包含“null”值。
但有没有这样的事情已经建立?我环顾GitHub或Codeplex无济于事,但搜索起来却很难。在开始我想象的将是一个非常复杂的课程之前,我想确保我不浪费我的时间。
我应该注意到,我长期坚持使用C#中的动态调度概念,因为它不是一种动态语言。老实说,我希望它根本没有添加到语言中,或者至少局限于COM互操作场景。
但话虽如此,我总是对如何“破解”语言功能以使他们做他们从未打算做的事情感到好奇。有时它会产生一些有用的东西。例如,有很多人使用IDisposable
接口和using
语句来做与释放资源无关的事情。
我怀疑我会在生产应用程序或任何需要交给其他开发人员的东西中使用它。
答案 0 :(得分:4)
视觉基础语言隐藏了很多胶水,这不是C#方式。 Variant类型具有大量转换函数,它们由vb运行时自动调用。 .NET也有自动转换功能,你只需要明确地使用它们:
dynamic x = 1.0;
int y = Convert.Int32(x);
使用C#来证明必须编写类似的代码,因为它不是一种隐藏成本的语言。