代码之家  ›  专栏  ›  技术社区  ›  mattmc3

VB中带选项Strict On的.net4.0framework动态特性?

  •  16
  • mattmc3  · 技术社区  · 14 年前

    在4.0框架中有什么方法可以使用新的动态特性吗 ExpandoObject 在VB.NET中没有设置 Option Strict Off ? 使用C#,您将失去类型安全性 只有 dynamic . 但是在VB中,我发现使用这些特性的唯一方法是使用旧的 从一开始就在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
    

    这真的对吗?如果是这样的话,还有什么最好的方法可以继续使用 展开对象

    3 回复  |  直到 14 年前
        1
  •  8
  •   Alex Essilfie    14 年前

    看来你不能不关闭选项严格。


    编辑


    在查阅了一些关于 ExpandoObject ,它似乎在C#中用于COM和Office互操作。传统上,在VB.NET中 Object 用于此目的,这将要求您关闭选项Strict。

    要回答您的问题,这意味着您可以使用 对象 展开对象 [如果VB.NET中存在这样的类型],则设置 Option Infer On 选项严格打开或关闭 .
    您还可以考虑使用分部类将非选项严格代码本地化到特定文件。



    建议阅读

        2
  •  4
  •   Stan    14 年前

    不,这是现代的晚装。

        3
  •  3
  •   MarkJ    14 年前

    我没试过这个,也不好看,但你应该可以 use CallByName .

    Partial Public Class ClassX  
    
       Public Sub TestDynamic()  
          Dim dyn As Object = New System.Dynamic.ExpandoObject()  
          Dim a As String = "1" ''# Option Strict is on  
          Dim obj As Object = "999"  
    
          ''# dyn.Str = a  
          CallByName(dyn, "Str", CallType.Set, a) 
          Console.WriteLine("dyn.Str = {0} : Type = {1}", 
            CallByName(dyn, "Str", CallType.Get, a), 
            CallByName(dyn, "Str", CallType.Get, a).GetType().ToString()
          )     
    
          ''# etc etc... I can't face any more of that  
    

    推荐文章