16

ExpandoObject設定せずにVB.NETのように4.0フレームワークの新しい動的機能を使用する方法はあります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

これは本当に正しいですか?そして、もしそうなら、それでもそのようなものを使用しExpandoObject、すべてのタイプの安全性を失うリスクを軽減するための最良の方法は何ですか?部分的なクラス?それとも、この場合、型の安全性についてそれほど心配するべきではありませんか?

4

3 に答える 3

8

OptionStrictをオフにする必要がないようです。でも、もう少し調べます。


編集


に関するいくつかのドキュメントを確認したところExpandoObject、C#forCOMおよびOfficeInteropで使用されているようです。従来、VB.NETでは、Objectはそのような目的で使用されていたため、OptionStrictをオフにする必要がありました。

あなたの質問に答えるために、これは、 [VB.NETにそのようなタイプが存在する場合]Objectの代わりにタイプを使用してVB.NETで動的タイプを使用できることを意味し、OptionStrictOnまたはOffを設定します。 部分クラスを使用して、OptionStrict以外のコードを特定のファイルにローカライズすることも検討できます。 推奨読書ExpandoObjectOption Infer On




于 2010-08-01T02:51:06.360 に答える
4

いいえ。これは、現代の遅延バインディングの一種です。

于 2010-08-01T02:23:32.710 に答える
4

私はこれを試していません、そしてそれはきれいではないでしょう、しかしあなたは使う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  

私が言ったように、それはきれいではありません。

于 2010-08-31T12:15:59.133 に答える