Кэширование propertyinfo абстрактного класса - PullRequest
0 голосов
/ 19 января 2012

Я играл с реализацией абстрактного базового класса, который с помощью отражения выполняет сопоставление SQL с объектами.

Я сделал несколько тестов и решил, что хочу реализовать стратегию кэширования для информации о свойствах объектов (чтобы предотвратить последующий поиск по ним). Моим первым инстинктом было попытаться реализовать нечто подобное.

Public MustInherit Class BaseModel
    Implements IFillable

    Private Shared PropertyCache As List(Of PropertyInfo)

    Sub New()
        PropertyCache = New List(Of PropertyInfo)
        For Each itm As PropertyInfo In Me.GetType().GetProperties
            PropertyCache.Add(itm)
        Next
    End Sub
End Class

но потом я понял, что это, очевидно, не сработает, потому что будет переопределено при последующих экземплярах объекта.

Так что теперь я застрял, как вы можете реализовать абстрактный класс, который кэширует свое отражение "метаданных"?

EDIT:

Это лучшее (решение моей проблемы), которое я могу придумать. Надеюсь, кто-то может предложить что-то лучшее?

Public MustInherit Class BaseModel
    Implements IFillable

    Private Shared ReadOnly PropertyCache As New Dictionary(Of String, PropertyInfo)

    Sub New()
        Dim typeName As String = Me.GetType.ToString
        For Each itm As PropertyInfo In Me.GetType().GetProperties
            Dim lookupKey As String = String.Format("{0}_{1}", typeName, itm.Name)
            If Not PropertyCache.ContainsKey(lookupKey) Then
                PropertyCache.Add(lookupKey, itm)
            End If
        Next
    End Sub
End Class

1 Ответ

0 голосов
/ 14 марта 2012

Если вы поместите код в Shared Sub New вместо этого, он должен выполняться только один раз.

http://msdn.microsoft.com/en-us/library/aa711965(v=vs.71).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...