2014-02-25 61 views
1

我有幾個屬性的類。.NET - 使用類作爲一個參數

Public Class test 
    Public Property a As String 
    Public Property b As String 
    Public Property c As String 
    Public Property d As String 
    Public Property e As String 
    Public Property f As String 
    Public Property g As String 
End Class 

在我VB.net代碼,我將值分配給每個屬性。

我想發送整個測試類一個參數,並使用其中的所有值。

所以,如果我以後添加額外的參數,我希望他們能夠動態地使用,而不是寫這個每次:

Textbox1.text= test.a & test.b & test.c ....... 

沒有辦法做到這一點?

我不是真的寫在一個文本框的值,但是這僅僅是一個簡單的例子。

+0

您不能將它作爲參數傳遞給方法嗎?例如:'公用Sub的someMethod(T作爲測試)'你可以重寫你的類的ToString方法來顯示或以其他方式從您的屬性返回的數據與您在一個電話需要。 –

+1

這個課程的用途究竟是什麼?你可能有一個設計問題。 –

+0

@the_lotus我正在使用它來存儲變量的值,所以我不必每次都將它們全部作爲參數傳遞。 – HelpASisterOut

回答

1

我想你想要的是一個屬性。你需要一個屬性添加到您的類,如:

Public Property Combination() As String 
    Get 
     Return a & b & c & d & e ... 
    End Get 
End Property 

然後獲得價值,你會使用

Textbox1.text = test.combination 

(詳情你可以看到http://www.dotnetperls.com/property-vbnet

+0

這確實可以更容易地獲取所有值,但是通過代碼設置值會變得很難。 – HelpASisterOut

+1

你仍然可以以正常的方式使用你的屬性a,b,c,d等。這只是一個額外的財產,以及你的其他人,每次你打電話給它,你會得到你的其他屬性的最新組合。還是我誤解了一些東西? – 5uperdan

+0

,如果向類中添加更多屬性x,y,z,則只需在一個位置更改屬性。 – 5uperdan

0

我建議您覆蓋內置的ToString功能。此外,爲了進一步簡化此操作,請添加一個CType運算符。

Public Class test 

    Public Property a As String 
    Public Property b As String 
    Public Property c As String 
    Public Property d As String 
    Public Property e As String 
    Public Property f As String 
    Public Property g As String 

    Public Shared Widening Operator CType(obj As test) As String 
     Return If((obj Is Nothing), Nothing, obj.ToString()) 
    End Operator 

    Public Overrides Function ToString() As String 
     Return String.Concat(Me.a, Me.b, Me.c, Me.d, Me.e, Me.f, Me.g) 
    End Function 

End Class 

的,你可以只是做:

Textbox1.text = test 
0

有一種方法可以動態地獲取和設置任何對象的屬性值。 .NET中的這種功能統稱爲反射。例如,要通過所有的對象屬性的循環,你可以做這樣的事情:

Public Function GetPropertyValues(o As Object) As String 
    Dim builder As New StringBuilder() 
    For Each i As PropertyInfo In o.GetType().GetProperties 
     Dim value As Object = Nothing 
     If i.CanRead Then 
      value = i.GetValue(o) 
     End If 
     If value IsNot Nothing Then 
      builder.Append(value.ToString()) 
     End If 
    Next 
    Return builder.ToString() 
End Function 

在上面的例子中,它調用i.GetValue來獲得屬性的值,但你也可以撥打i.SetValue設置屬性的值。但是,反射效率不高,如果使用不當,會導致代碼變得脆弱。因此,一般來說,只要還有其他更好的方法來做同樣的事情,就應該避免使用反思。換句話說,你通常應該保存反思作爲最後的手段。

如果沒有更多的細節,這是很難肯定地說什麼其他的選擇,在您的特定情況下工作得很好,但我強烈懷疑,一個更好的解決辦法是使用ListDictionary,例如:

Dim myList As New List(Of String)() 
myList.Add("first") 
myList.Add("second") 
myList.Add("third") 
' ... 
For Each i As String In myList 
    Textbox1.Text &= i 
Next 

或者:

Dim myDictionary As New Dictionary(Of String, String)() 
myDictionary("a") = "first" 
myDictionary("b") = "first" 
myDictionary("c") = "first" 
' ... 
For Each i As KeyValuePair(Of String, String) In myDictionary 
    Textbox1.Text &= i.Value 
Next