C# 如何在.NET中继承并重写资源或其内容?

C# 如何在.NET中继承并重写资源或其内容?,c#,.net,vb.net,C#,.net,Vb.net,我有一个项目,我们称之为“BASE”,它有一堆.CSV文件作为资源。项目以不同的方法引用My.Resources.XXXXXXX,其中XXXXXXX是CSV文件名。我正在处理一个从“BASE”派生的类,我想更改一些.CSV文件,并用我的文件替换“BASE”项目中的文件。我希望基本项目中的方法在调用my.Resources.XXXXXX时使用我的CSV文件,而不是“基本”资源中的文件。有什么建议吗?(欢迎使用任何.NET语言)这有点像黑客,但效果很好: 在派生类中: Public Class My

我有一个项目,我们称之为“BASE”,它有一堆.CSV文件作为资源。项目以不同的方法引用My.Resources.XXXXXXX,其中XXXXXXX是CSV文件名。我正在处理一个从“BASE”派生的类,我想更改一些.CSV文件,并用我的文件替换“BASE”项目中的文件。我希望基本项目中的方法在调用my.Resources.XXXXXX时使用我的CSV文件,而不是“基本”资源中的文件。有什么建议吗?(欢迎使用任何.NET语言)

这有点像黑客,但效果很好:

在派生类中:

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
我的自定义资源管理器:

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
公共类MyResourceManager
继承ResourceManager
公共属性BaseResourceManager作为ResourceManager
公共属性BaseResourceManagerType作为类型
公共属性MyResourceManager作为ResourceManager=My.Resources.ResourceManager
公共分新()
MyBase.New()
'获取对基础应用程序的资源管理器的引用以保持其正常运行'
Dim ass As Assembly=Assembly.Load(“基本应用程序”)
BaseResourceManagerType=ass.GetType(“BaseApplication.My.Resources.Resources”)
BaseResourceManager=ReflectionHelper.GetStaticPropertyValue(BaseResourceManagerType,“ResourceManager”)
端接头
公共重写函数GetString(ByVal名称为String)为String
Dim ret As String=MyResourceManager.GetString(名称)
如果ret不是什么,那么
回程网
其他的
返回BaseResourceManager.GetString(名称)
如果结束
端函数
... 
末级

这有点像黑客,但效果很好:

在派生类中:

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
我的自定义资源管理器:

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
公共类MyResourceManager
继承ResourceManager
公共属性BaseResourceManager作为ResourceManager
公共属性BaseResourceManagerType作为类型
公共属性MyResourceManager作为ResourceManager=My.Resources.ResourceManager
公共分新()
MyBase.New()
'获取对基础应用程序的资源管理器的引用以保持其正常运行'
Dim ass As Assembly=Assembly.Load(“基本应用程序”)
BaseResourceManagerType=ass.GetType(“BaseApplication.My.Resources.Resources”)
BaseResourceManager=ReflectionHelper.GetStaticPropertyValue(BaseResourceManagerType,“ResourceManager”)
端接头
公共重写函数GetString(ByVal名称为String)为String
Dim ret As String=MyResourceManager.GetString(名称)
如果ret不是什么,那么
回程网
其他的
返回BaseResourceManager.GetString(名称)
如果结束
端函数
... 
末级

您的资源是否直接从自动生成的资源类访问?如果否,并且您正在控制资源的使用方式,则可以实现从资源读取的虚拟属性,然后在子类中重写它们。我无法控制资源的使用方式。它们只是在基本项目中使用My.Resources.XXXXXXX调用的。我可能可以改变基本项目,但我宁愿不改变。我宁愿以某种方式替换我的.Resources.XXXXXXX计算结果为.Hmmmm。。。问题是,在最后使用完全限定名(包括程序集名)标识的资源。而且它们不遵循任何继承模式。您可以使用System.Resources.ResourceManager切换资源文件,但我猜,资源不能像虚拟属性那样被部分覆盖。您的资源是否直接从自动生成的资源类访问?如果否,并且您正在控制资源的使用方式,则可以实现从资源读取的虚拟属性,然后在子类中重写它们。我无法控制资源的使用方式。它们只是在基本项目中使用My.Resources.XXXXXXX调用的。我可能可以改变基本项目,但我宁愿不改变。我宁愿以某种方式替换我的.Resources.XXXXXXX计算结果为.Hmmmm。。。问题是,在最后使用完全限定名(包括程序集名)标识的资源。而且它们不遵循任何继承模式。您可以使用System.Resources.ResourceManager切换资源文件,但我猜,资源不能像虚拟属性那样被部分覆盖。