2012-05-21 27 views
1

我有一個項目,我們稱之爲「BASE」,它有一堆.CSV文件作爲資源。該項目使用XXXXXXX是CSV文件名的不同方法引用My.Resources.XXXXXXX。我正在研究一個派生自「BASE」的類,我想更改一些.CSV文件,並將我的「BASE」項目中的文件替換掉。我希望基礎項目中的方法在調用My.Resources.XXXXXX而不是「BASE」資源中的文件時使用我的CSV文件。有關如何做到這一點的任何提示? (任何.NET語言是歡迎)如何繼承並重寫資源或.NET中的內容?

+0

你的資源直接從自動生成的資源類訪問?如果否,並且您正在控制資源的使用方式,則可以實現從資源讀取的虛擬屬性,然後在子類中重寫它們。 –

+0

我無法控制資源的使用方式。他們只是在BASE項目中使用My.Resources.XXXXXXX調用。我可能能夠改變基礎項目,但我寧願不要。我寧願以某種方式替換My.Resources.XXXXXXX評估的內容。 – Denis

+0

嗯...問題在於,在資源標識完全限定的名稱,包括程序集名稱。他們沒有遵循任何繼承模式。您可以使用System.Resources.ResourceManager切換資源文件,但是我的猜測是,資源不能像虛擬屬性一樣被部分覆蓋。 –

回答

1

這是一個小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