2011-12-30 7 views
1

VB.Netコードに関連する質問があります。VB.NetエクステンションをDataTable(インデックス)として作成

私たちが使用できるのDataTableていることがわかり

:私は、この機能が拡張して実現できることがわかりインテリセンスで

DataTable(0) ' This return a DataRow with the selected index

...しかし、私は拡張機能を作成する場合は、必ず私が参照してください必要があります使用前の拡張機能

Public Module asdadsdas 
    <System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)> 
    <System.Runtime.CompilerServices.ExtensionAttribute()> 
    Friend Function MyExt(ByVal pMyObject As MyObject, ByVal ColumnName As String) As MyObject.ColumnData 

     Return pMyObject.Columns(0) 

    End Function 
End Module 

Public Class MyObject 
    Friend Structure ColumnData 
     Friend vNombre As String 
     Friend vApellido As String 
     Friend vTelefono As String 

     Public Property Nombre As String 
      Get 
       Return Me.vNombre 
      End Get 
      Set(ByVal value As String) 
       Me.vNombre = value 
      End Set 
     End Property 

    End Structure 

    Friend Columns() As ColumnData 

    Public Sub add(ByVal MyColumn As String) 
     ReDim Columns(0) 
     Columns(0).vNombre = MyColumn 
    End Sub 

End Class 

Public Class Form1 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Dim Test As New MyObject 
     Test.add("TEST 001") 
     ' HERE IS THE PROBLEM 
     Test("TEST 001") 
     ' CORRECT USE 
     Test.MyExt("TEST 001") 
    End Sub 
End Class 

私の具体的な質問:どのように特定のオブジェクトでデフォルトの拡張子を作ることができますか?


@competent_tech:男あなたはあなたのコメントで感謝しています!

これは私の問題の解決策です:columnDataは

Default Property Item(ByVal ColumnName As String) As ColumnData 
    Get 
     Return Data(0) 
    End Get 
    Set(ByVal value As ColumnData) 

    End Set 
End Property 

Public Sub add(ByVal Name As String, ByVal LastName As String, ByVal Phone As String) 
    If Data Is Nothing Then 
     ReDim Data(0) 
     Data(0) = New ColumnData 
    End If 

    With Data(0) 
     .Name = Name 
     .LastName = LastName 
     .Phone = Phone 
    End With 


End Sub 

エンドクラス

パブリック・クラスとして

Public Class ColumnData 
Friend Name As String 
Friend LastName As String 
Friend Phone As String 

エンドクラス

パブリック・クラスMyColumns フレンドのデータ() Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim Test As New MyColumns 

    Test.add("Name 001", "bolanos.m", "500-2004-1000") 

    Debug.Print(Test("Name 001").LastName & " - " & Test("Name 001").Phone) 
    ' bolanos.m - 500-2004-1000 

    Test("Name").LastName = "BOLANOS.M MODIFY" 

    Debug.Print(Test("Name 001").LastName & " - " & Test("Name 001").Phone) 
    ' BOLANOS.M(MODIFY - 500 - 2004 - 1000) 
End Sub 

エンドクラス

+0

あなたがすることはできません。データテーブルをカプセル化しようとするか、またはそれを継承することがあります。しかし、拡張として、そのコンセプトはプロパティに適用されるので、 "デフォルト"を作成することはできません.net 4.0の拡張プロパティを作成することはできません –

答えて

1

理由だけではなく、MyObjectにクラスにデフォルトプロパティを追加しませんか?

Default Public Property IndexedColumn(index As String) As ColumnData 
    Get 
     Return Columns(index) 
    End Get 
    Set(value As ColumnData) 
     Columns(index) = value 
    End Set 
End Property 
Default Public Property IndexedColumn(index As Integer) As ColumnData 
    Get 
     Return Columns(index) 
    End Get 
    Set(value As ColumnData) 
     Columns(index) = value 
    End Set 
End Property 

あなたは、構造体の露出レベルを変更する必要がありますとアクセスは次のようになります。

Dim oColumnData = Test("TEST 001") 
+0

プロパティを使用する前に試しましたが... よう...値を割り当てるために、結果を使用します。 テスト(「TEST 001」)の名前=「私の名前」 しかし...このことはできません – MiBol

+1

ああ、それは簡単な修正です:columnDataはクラス作ります構造体ではなく、MyObjectクラスの外に移動します。 –

+0

私はこのオプションを試します... – MiBol

関連する問題