2013/01/28(Mon) 15:09:26 編集(投稿者)
■No64968 (コンバート後に悩む人 さん) に返信
> 確かにそのとおりだと思います。
> あまりソースを改変しないことを目的にやるとしたらというところで検討していました。
> StringBuilderがいいのかもしれないので、今後念頭に入れたいと思います。
> 今はもう少し、この手法で調査・試行錯誤してみたいと思っています。
あまりソースを改変しないことを目的とする場合、多少大き目の追加を行うとよい場合があります。
例えば以下のようなクラスClass1を作成してそこから派生したClassA,ClassBは簡単な実装でもとの
構造体と似たような動作をさせることができるかと思います。Class1の実装を直せば希望の動きが実装
出来るのではないでしょうか?参考にしてみて下さい。要件によっては前述したようにByte配列を用いると
良いと思います。
Public Class Class1
Private _InnerValue As String
Private _FieldStarts() As Integer
Private _FieldLengths() As Integer
Public Sub New(ParamArray FieldLengthS() As Integer)
Dim TotalSize As Integer = 0
Dim FieldLength As Integer
Dim Pos As Integer = 0
Dim Idx As Integer = 0
_FieldStarts = New Integer(FieldLengthS.Length) {}
_FieldStarts(Idx) = Pos
For Each FieldLength In FieldLengthS
TotalSize += FieldLength
Idx += 1
Pos += FieldLength
_FieldStarts(Idx) = Pos
Next
_FieldLengths = FieldLengthS
_InnerValue = New String(" "c, TotalSize)
End Sub
Protected Property InnerValue As String
Get
Return _InnerValue
End Get
Set(value As String)
Dim NewValueLength = value.Length
Dim MyValueLength = _InnerValue.Length
Select Case NewValueLength
Case Is < MyValueLength
_InnerValue = value & New String(" "c, MyValueLength - NewValueLength)
Case MyValueLength
_InnerValue = value
Case Else
_InnerValue = value.Substring(0, MyValueLength)
End Select
End Set
End Property
Public Property Value(Index As Integer) As String
Get
Dim FieldStart As Integer = _FieldStarts(Index)
Dim FieldLength As Integer = _FieldLengths(Index)
Return _InnerValue.Substring(FieldStart, FieldLength)
End Get
Set(value As String)
Dim FieldStart As Integer = _FieldStarts(Index)
Dim FieldLength As Integer = _FieldLengths(Index)
Dim NewValue As New StringBuilder
'設定する部分の前
If FieldStart > 1 Then
NewValue.Append(_InnerValue.Substring(0, FieldStart))
End If
'設定する文字列
Select Case value.Length
Case Is < FieldLength
NewValue.Append(value.PadRight(FieldLength, " "c))
Case FieldLength
NewValue.Append(value)
Case Else
NewValue.Append(value.Substring(0, FieldLength))
End Select
'設定する部分の後ろ
If _InnerValue.Length > FieldStart + FieldLength + 1 Then
NewValue.Append(_InnerValue.Substring(FieldStart + FieldLength))
End If
_InnerValue = NewValue.ToString
End Set
End Property
Public Sub Copy(Dest As Class1)
Dest.InnerValue = Me.InnerValue
End Sub
End Class
Public Class ClassA
Inherits Class1
Public Sub New()
MyBase.New(2, 3, 5, 7)
End Sub
Public Property aaaa As String
Get
Return MyBase.Value(0)
End Get
Set(value As String)
MyBase.Value(0) = value
End Set
End Property
Public Property bbbb As String
Get
Return MyBase.Value(1)
End Get
Set(value As String)
MyBase.Value(1) = value
End Set
End Property
Public Property cccc As String
Get
Return MyBase.Value(2)
End Get
Set(value As String)
MyBase.Value(2) = value
End Set
End Property
Public Property ddddd As String
Get
Return MyBase.Value(3)
End Get
Set(value As String)
MyBase.Value(3) = value
End Set
End Property
End Class
Public Class ClassB
Inherits Class1
Public Sub New()
MyBase.New(100)
End Sub
Public Property strB As String
Get
Return MyBase.Value(0)
End Get
Set(value As String)
MyBase.Value(0) = value
End Set
End Property
End Class
# ValueのSet部分を修正