【问题标题】:Overload Module Functions Across Projects跨项目重载模块函数
【发布时间】:2011-05-04 02:32:14
【问题描述】:

我有一个包含多个项目的解决方案。其中一个项目是一组通用代码,这些代码将驱动几个不同的客户端应用程序和一个服务器应用程序。我有一个命名空间Common,它本身就在一个项目中。这个命名空间有几个公共函数:FormaterUnFormater。这些功能在其他各种项目中都能正常工作。但是,在某些项目中,我希望能够重载这些功能。重载将采用仅对该特定项目唯一的数据结构,并将其变异为 Common FormaterUnFormater 可以理解的格式,然后将工作交给他们完成。

这有几个优点。我喜欢将我的代码的公共部分放在一个地方,但我也想重载它们,使它们更容易在具有自定义数据类型的各种项目中使用。

演示(示例代码):

项目一:

Namespace Common
    Public Module FormatingServices
        Public Function Formater(ByVal DataToFormat As String) As String
            'format the data
        End Function

        Public Function UnFormater(ByVal DataToUnFormat As String) As String
            'unformat the data
        End Function
    End Module
End Namespace

项目 2:

Namespace Common
    Public Module FormattingServices
        Public Function Formater(ByVal DataToFormat As StringBuilder) As String
            Dim myString As String = DataToFormat.ToString
            Return Formater(myString)
        End Function

        Public Function UnFormater(ByVal DataToUnFormat As StringBuilder) As String
            Dim myString As String = DataToUnFormat.ToString
            Return UnFormater(myString)
        End Function
    End Module
End Namespace

在两个函数中myString 的项目 2 中,我收到以下错误:

“'String' 类型的值无法转换为 'System.Text.StringBuilder'。

如何让它工作?有没有可能?

更新:

这是我目前的解决方案。有人可以解释为什么这有效而上述无效吗?一堆共享函数应该和一个模块中的函数是一样的,所以没看懂。

项目一:

Public Class FormattingServices
    Public Shared Function Formatter(ByVal myString As String) As String
        Return myString & myString
    End Function
End Class

项目 2:

Imports System.Text

Namespace Common
    Public Class FormattingServices
        Inherits ClassLibrary1.FormattingServices
        Public Overloads Shared Function Formatter(ByVal myString As StringBuilder) As String
            Return Formatter(myString.ToString)
        End Function
    End Class
End Namespace

项目 3:

Imports ClassLibrary2.Common.FormattingServices
Imports System.Text

Module Module1

    Sub Main()
        Console.WriteLine("String Test: " & Formatter("This is a test string."))
        Console.WriteLine("StringBuilder Test: " & Formatter(New StringBuilder("This is a test StringBuilder string.")))
        Console.Read()
    End Sub

End Module

【问题讨论】:

    标签: .net namespaces overloading


    【解决方案1】:

    您不能将两个具有相同名称的不同程序集的类型视为同一个类。

    当您想要引用正确的对象时,您需要在命名空间中包含项目名称。 Project1.Common.FormaterProject2.Common.Formater(旁注 C# 对此的处理方式略有不同,因为它有一个您可以更改的全局限定符)

    但是,根据您的目标,我认为您可能希望完全采用不同的方法。看起来您希望您的调用代码告诉您的 Formater 如何处理其逻辑的某些部分,但不是全部。这通常使用Inversion of ControlDependency Injection. 来完成

    在我看来,依赖注入比较容易上手,因为它的概念数量很少。

    【讨论】:

    • 我同意它不应该产生错误,但确实如此。我已经重新编写了所有代码并引用了它。这一切都在一个解决方案中。如果我从项目 2 中删除命名空间,我可以调用 Common.FormaterCommon.UnFormater 就好了。
    • @cjbarth。如果我理解你的意思是说你有两种名称完全相同的类型,包括两个不同程序集中的命名空间?
    • @ConradFrix。正确的。在一个解决方案中,我有项目 1 和项目 2。项目 1 的命名空间 Common 和函数 Formater(我刚刚意识到我拼写错误),项目 2 的命名空间 Common 和函数 Formater 重载了 @项目 1 中的 987654331@。如果它们在同一个项目中,它们会正常工作,但由于它们在两个不同的项目中,我会遇到错误。
    • @cjbarth 看起来我确实误解了你的问题。我更新了我的答案,希望对您有所帮助。
    • @ConradFrix 感谢您的解释。我曾想象我可以在任何地方使用重载,并且编译器会足够聪明,可以在我的整个代码库中找到唯一匹配并使用那个的。似乎很愚蠢,它不能为我做到这一点。我会考虑您的建议并提供反馈。
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2018-06-10
    • 2016-12-24
    • 1970-01-01
    • 2018-10-10
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多