VB中的.NET 4.0框架动态功能与Option Strict On?

mat*_*mc3 16 vb.net dynamic .net-4.0 expandoobject

是否有任何方法可以在4.0框架中使用新的动态功能,如ExpandoObjectVB.NET中没有设置Option Strict Off?使用C#,只有使用您明确声明的变量才会丢失类型安全性dynamic.但是使用VB,我发现使用这些功能的唯一方法就是Option Strict Off从一开始就在VB.NET中使用的旧技巧.如果没有Option Strict,文件中的所有内容都会被模糊输入污染,如下所示:

Option Explicit On
Option Strict Off
Option Infer On

Partial Public Class ClassX

   Public Sub TestDynamic()
      Dim dyn As Object = New System.Dynamic.ExpandoObject()
      Dim a As String = 1 ''# Ew!
      Dim obj As Object = "999"

      dyn.Str = a   ''# a is a string, remember?  Even though it has a number
      ''# dyn.Str = 1 : Type = System.String
      Console.WriteLine("dyn.Str = {0} : Type = {1}", dyn.Str, dyn.Str.GetType().ToString())

      dyn.Num = 123
      ''# dyn.Num = 123 : Type = System.Int32
      Console.WriteLine("dyn.Num = {0} : Type = {1}", dyn.Num, dyn.Num.GetType().ToString())

      dyn.Dbl = obj / 9
      ''# dyn.Dbl = 111 : Type = System.Double
      Console.WriteLine("dyn.Dbl = {0} : Type = {1}", dyn.Dbl, dyn.Dbl.GetType().ToString())

      dyn.Obj = obj
      ''# dyn.Obj = 999 : Type = System.String
      Console.WriteLine("dyn.Obj = {0} : Type = {1}", dyn.Obj, dyn.Obj.GetType().ToString())

      dyn.Dte = #5/5/1955#
      ''# dyn.Dte = 7/7/1977 12:00:00 AM : Type = System.DateTime
      Console.WriteLine("dyn.Dte = {0} : Type = {1}", dyn.Dte, dyn.Dte.GetType().ToString())

      AmICalled(dyn.Num)
      AmICalled(dyn.Obj)
      AmICalled(dyn.Str)
      AmICalled(dyn.Dbl)

      Try
         AmICalled(dyn.Dte)
      Catch
         Console.WriteLine("Dates don't convert to ints I guess... but we don't know that 'till runtime")
      End Try

      Console.WriteLine(dyn.Num + dyn.Str) ' 124!?
      Console.WriteLine(dyn.Num & dyn.Str) ' 1231!?

   End Sub

   Private Sub AmICalled(ByVal i As Integer)
      Console.WriteLine("AmICalled was called with: " & i)
   End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

这真的是对的吗?而且,如果是这样,那么仍然使用类似的东西ExpandoObject并降低失去所有类型安全的风险的最佳方法是什么?部分课程?或者我不应该在这种情况下担心类型安全吗?

Ale*_*fie 7

看来你不能不必关闭Option Strict.我会研究一些.


编辑


在浏览了一些文档之后ExpandoObject,它似乎在C#中用于COM和Office Interop.传统上,在VB.NET中,它Object被用于此类目的,并且需要您关闭Option Strict.

要回答您的问题,这意味着您可以使用VB.NET中的动态类型Object而不是ExpandoObject[如果VB.NET中存在这样的类型],set Option Infer OnOption Strict On或Off.
您还可以考虑使用部分类将非Option Strict代码本地化为特定文件.



建议阅读