2012-05-21 1 views
1

J'ai un projet, appelons-le "BASE", qui a un tas de fichiers .CSV en tant que ressources. Le projet fait référence à My.Resources.XXXXXXX dans différentes méthodes où XXXXXXX est le nom de fichier CSV. Je travaille sur une classe qui dérive de "BASE" et je voudrais changer certains des fichiers .CSV et remplacer ceux qui sont dans le projet "BASE" avec le mien. Je voudrais que les méthodes du projet de base utilisent mes fichiers CSV quand il appelle My.Resources.XXXXXX au lieu des fichiers qui se trouvent dans les ressources de "BASE". Des conseils sur la façon de le faire? (Tout langage de .NET est la bienvenue)Comment puis-je hériter, puis remplacer une ressource ou son contenu dans .NET?

+0

Êtes-vous les ressources être accédé directement à partir de classes de ressources générées automatiquement? Si non et que vous contrôlez la manière dont les ressources sont utilisées, vous pouvez implémenter des propriétés virtuelles, lues à partir de la ressource, puis les remplacer dans vos sous-classes. –

+0

Je ne peux pas contrôler la façon dont les ressources sont utilisées. Ils sont simplement appelés en utilisant My.Resources.XXXXXXX dans le projet BASE. Je pourrais être en mesure de changer le projet de base, mais je préfère ne pas. Je préfère remplacer en quelque sorte ce que My.Resources.XXXXXXX évalue. – Denis

+0

Hmmmm ... le problème est qu'à la fin des ressources identifiées avec nom qualifié complet, y compris le nom de l'assembly. Et ils ne suivent aucun modèle d'héritage. Vous pouvez changer le fichier de ressources avec System.Resources.ResourceManager mais à mon avis, les ressources ne peuvent pas être partiellement remplacées comme les propriétés virtuelles. –

Répondre

1

C'est un peu hackey mais fonctionne très bien:

Dans votre classe dérivée:

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 

My Custom 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 
Questions connexes