這是一個小hackey但偉大工程:
在派生類:
Public Class MyApplication
Inherits BaseApplication
Private Shared Property ResourceManager As New MyResourceManager
Shared Sub New()
Const fieldName As String = "resourceMan"
'set base resource manager to my specialized resource manager using reflection'
ReflectionHelper.SetStaticFieldValue(ResourceManager.BaseResourceManagerType, fieldName, ResourceManager)
End Sub
...
End Class
我的自定義的ResourceManager:
Public Class MyResourceManager
Inherits ResourceManager
Public Property BaseResourceManager As ResourceManager
Public Property BaseResourceManagerType As Type
Public Property MyResourceManager As ResourceManager = My.Resources.ResourceManager
Public Sub New()
MyBase.New()
'get a reference to the resource manager for the base application to keep it around'
Dim ass As Assembly = Assembly.Load("BaseApplication")
BaseResourceManagerType = ass.GetType("BaseApplication.My.Resources.Resources")
BaseResourceManager = ReflectionHelper.GetStaticPropertyValue(BaseResourceManagerType, "ResourceManager")
End Sub
Public Overrides Function GetString(ByVal name As String) As String
Dim ret As String = MyResourceManager.GetString(name)
If ret IsNot Nothing Then
Return ret
Else
Return BaseResourceManager.GetString(name)
End If
End Function
... <override all the other members of ResourceManager in the same fashion as above>
End Class
你的資源直接從自動生成的資源類訪問?如果否,並且您正在控制資源的使用方式,則可以實現從資源讀取的虛擬屬性,然後在子類中重寫它們。 –
我無法控制資源的使用方式。他們只是在BASE項目中使用My.Resources.XXXXXXX調用。我可能能夠改變基礎項目,但我寧願不要。我寧願以某種方式替換My.Resources.XXXXXXX評估的內容。 – Denis
嗯...問題在於,在資源標識完全限定的名稱,包括程序集名稱。他們沒有遵循任何繼承模式。您可以使用System.Resources.ResourceManager切換資源文件,但是我的猜測是,資源不能像虛擬屬性一樣被部分覆蓋。 –