私はついにこの問題の解決策を考え出しました。tcarvinからの提案から始めて、私はいくつかのことを変えて、この解決策にたどり着きました。
共有辞書を使用して、別のヘルパークラスを作成しました。
Private Shared _QuestionStyles As New Dictionary(Of Type, Func(Of Byte(), QuestionBase)) From {
{GetType(QuestionStyleOne), Function(questionBinary)
Return Deserialize(Of QuestionStyleOne)(questionBinary)
End Function},
{GetType(QuestionStyleTwo), Function(questionBinary)
Return Deserialize(Of QuestionStyleTwo)(questionBinary)
End Function}
}
その同じクラスで、辞書に格納されている関数を修正するために取得しようとするメソッドを作成しました。
Public Shared Function DoDeserializeQuestion(ByVal questionType As Type, ByVal questionBinary As Byte())
Dim deserializeQuestion As Func(Of Byte(), QuestionBase) = Nothing
If (_QuestionStyles.TryGetValue(questionType, deserializeQuestion)) Then
Return deserializeQuestion(questionBinary)
Else
Throw New ArgumentException("QuestionType not known")
End If
End Function
今、私はこれを呼び出す必要がありました:
Using reader As IDataReader = GetQuestions(id)
While (reader.Read)
collection.Add(QuestionTypeHelper.DoDeserializeQuestion(question.GetType, CType(reader.Item(DataFields.Question), Byte())))
End While
End Using
これにより、DBから適切な質問が取得され、そのバイナリが逆シリアル化され、適切な質問タイプにキャストされます。他の場合やそのタイプの鋳造が必要な場合に非常に再利用可能です。