我有一个包含多个项目的解决方案。其中一个项目是一组公共代码,它将驱动多个不同的客户端应用程序和一个服务器应用程序。我有一个名称空间Common
,它本身就在一个项目中。此命名空间有几个公共函数:Formater
和UnFormater
。这些功能在各种其他项目中都能正常工作。但是,在某些项目中,我希望能够重载这些功能。重载将采用仅对该特定项目唯一的数据结构,并将其变为Common
Formater
和UnFormater
可以理解的格式,然后将工作传递给它们以获取完成。
这有几个优点。我喜欢能够将代码的公共部分集中在一个地方,但我还想重载它们,以便在具有自定义数据类型的各种项目中更容易使用它们。
演示(示例代码):
项目1:
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'。
我如何让它工作?它甚至可能吗?
更新:
这是我到目前为止的解决方案。有人可以解释为什么这有效,而上述情况不然?一堆共享函数应该与模块中的函数相同,所以我不明白。
项目1:
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
答案 0 :(得分:0)
您不能将具有相同名称的两个不同程序集的两种类型视为同一类。
如果要引用正确的对象,则需要在项目名称中包含项目名称。 Project1.Common.Formater
和Project2.Common.Formater
(旁注C#处理的方式略有不同,因为它有一个全局限定符,你可以改变它)
然而,基于你的目标,我想你可能想要采取不同的方法。看起来你希望你的调用代码告诉你的Formater如何对其逻辑的某些部分采取行动,但不是全部。这通常使用Inversion of Control或Dependency Injection.
完成在我看来,依赖注入更容易入手,因为它具有较低的概念数。