2012-05-10 3 views
2

私はVB.netで働いていて、ジェネリックToStringを作成したいと思います。 には、 "私の中の" For Eachを行う方法があります。私の各プライベート変数のためのvb.net

サンプル

Public Property Var1() As String {... get ... set ...} 
Public Property Var2() As String {... get ... set ...} 
Public Property Var2() As String {... get ... set ...} 

Public Overrides Function ToString() As String 
    dim str as stringbuilder 
    for each item in Me 
     str.append(item.tostring()) 
    next 
    return str 
End Function 

私の質問の理由その私の変数のいくつかは、ヌル(何)になることはできませんので。 だから、このような一般的なと、私は

if item isnot nothing then 
    str.append(item.tostring()) 
end if 

を行うことができます多分もっと良い方法をtheresの?

これはGetFieldsでリフレクションを使用して達成することができます

+1

を使い表示したい場合は、しかし、あなたはやるべきではない:ここに行きます! 'ToString'は可能な限り速くなければならず、それは逆になります。 –

+0

なぜ、反射を使って 'ToString()'を書くのですか?あなたはあなたの特性が何であるかを知っています。彼らの意味を知っていて、それらを使うだけです。クラスに大きな値を持つ多くのプロパティがある場合、本当にすべての情報を表示するToString()が必要ですか?あなたの 'ToString'オーバーライドはあなたのクラスに特有である必要があります。 – Jodrell

+0

ええ、そういうことですが、私はすべてのtoString(またはPrintElements()のような関数)に貼り付けることができるコードブロックの作成を考えていました。そのため、すべてのローカル変数を書き換える必要はありません。なぜなら、時にはクラスに多くの変数があるためです。それは速くて、必要ならばnothing.toString()のようなエラーをキャッチすることができます。 – forX

答えて

0

タンク。

Public Class [MyClass] 
    Private a As String 
    Private b As String 

    Public Sub New(a As String, b As String) 
     Me.a = a 
     Me.b = b 
    End Sub 

    Public Overrides Function ToString() As String 
     Dim sb = New StringBuilder() 
     For Each item In [GetType]().GetFields(BindingFlags.NonPublic Or BindingFlags.Instance) 
      sb.Append(item.Name) _ 
       .Append("=") _ 
       .Append(item.GetValue(Me)) _ 
       .Append(" ") 
     Next 
     Return sb.ToString() 
    End Function 

は、プロパティあなたはリフレクションを使用することができGetProperties

+0

タンクは、あなたが望んだthatsです。 – forX

関連する問題