VB.Net在不污染全局命名空间的情况下制作扩展方法?

VB.Net在不污染全局命名空间的情况下制作扩展方法?,vb.net,extension-methods,Vb.net,Extension Methods,要在vb.net中编写扩展方法,必须将它们放在模块中,模块中定义的所有方法都会添加到全局命名空间中 是否有任何方法可以从全局命名空间中删除这些方法,以便它们仅用作扩展方法,或者如果您实际上是先编写模块名的话 示例 TypeExtensionMethods.vb: Imports System.Runtime.CompilerServices Public Module TypeExtensionMethods Private ReadOnly numericTypes As TypeC

要在vb.net中编写扩展方法,必须将它们放在模块中,模块中定义的所有方法都会添加到全局命名空间中

是否有任何方法可以从全局命名空间中删除这些方法,以便它们仅用作扩展方法,或者如果您实际上是先编写模块名的话

示例

TypeExtensionMethods.vb:

Imports System.Runtime.CompilerServices

Public Module TypeExtensionMethods
    Private ReadOnly numericTypes As TypeCode() = {
        TypeCode.Byte, TypeCode.SByte, TypeCode.UInt16,
        TypeCode.UInt32, TypeCode.UInt64, TypeCode.Int16,
        TypeCode.Int32, TypeCode.Int64, TypeCode.Decimal,
        TypeCode.Double, TypeCode.Single}

    <Extension()>
    Public Function IsNumber(type As Type) As Boolean
        Dim currentTypeCode As TypeCode = Type.GetTypeCode(type)
        Return currentTypeCode.IsNumber()
    End Function

    <Extension()>
    Public Function IsNumber(type As TypeCode) As Boolean
        Return numericTypes.Any(Function(tc) tc = type)
    End Function
End Module

看来这是不可能的

我有点困惑。您所说的“它们仅用作扩展方法”是什么意思?如果您必须对模块名称进行profix,那么您使用什么扩展方法呢?您似乎直接调用了该方法。根据你的提问,我认为扩展方法是错误的。相反,您可以对有问题的类型进行子类化,并添加所需的方法。这样,您可以将原始类型强制转换为子类类型并调用该方法。让我知道这是否是一个选项,以及您是否需要som示例代码。@Sascha如果您在模块中定义了一个方法,您可以直接按其名称调用它,而不使用它作为扩展方法或使用模块的名称,因此假设我定义了一个扩展方法
IsNumeric
现在它在全局命名空间中,并且可以使用
IsNumeric(价值…)
现在让我们假设你有100个扩展方法,现在它们都污染了全局名称空间…子分类不是解决方案,我想要扩展方法,但我不想在我的全局名称空间中使用它们。@Sascha子分类不起作用,让我们假设你从
FileInfo.FullName
字符串的第一个
string
sealed
因此,我不能继承它第二,即使我可以继承它,我也不能将特定的字符串转换为我自己的类型,因为我没有首先创建字符串,第三,如果每次我需要运行一个方法时都必须转换,我会用许多丑陋的转换污染我的代码…想法可能不值得做…如果你可以单独使用一个项目扩展方法,使其成为一个C#项目。如果这不行,并且您可以在解决方案之外使用单独的VB项目,请对程序集进行重新生成,以从模块中删除StandardModule属性。(讽刺的是,有一个HideModuleName属性的作用与您想要的相反:它使您的result2案例无法编译。)
Class Class1

    Sub Main(value as Object)
        'This should work
        dim result1 as Boolean = value.GetType().IsNumber()
        'This should work
        dim result2 as Boolean = TypeExtensionMethods.IsNumber(value.GetType())
        'This should not work, the method IsNumber is polluting as it can be called without specifying where its defined.
        dim result3 as Boolean = IsNumber(value.GetType())
    End Sub
End Class