【问题标题】:VB.Net Extension Function Not a Member of StringVB.Net 扩展函数不是字符串的成员
【发布时间】:2019-06-28 18:12:45
【问题描述】:

我正在尝试将整个 asp.net 应用程序中的一些常见功能折叠到一些字符串扩展方法中,但我遇到了一个问题,即我们的网站正在排除编译器错误,这些方法不是 String 的成员。

这是我创建的 Utilities 命名空间中的模块定义:

Imports System
Imports System.IO
Imports System.Runtime.CompilerServices
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports Telerik.Web.UI
Imports System.Data
Imports System.Collections.Generic
Imports System.Data.SqlClient

Namespace Utilities    
    'This extension extends the String class with new functions to check string validity.  Add any such new functions here
    <Extension()> _
    Public Module StringExtensions
        <Extension()> _
        Public Function IsAlphaNumeric(targ As String) As Boolean
            Return System.Text.RegularExpressions.Regex.IsMatch(targ, "^[a-zA-Z0-9]+$")
        End Function

        Public Function IsNumeric(targ As String) As Boolean
            Return System.Text.RegularExpressions.Regex.IsMatch(targ, "^[0-9]+$")
        End Function

        Public Function RegexRemove(targ As String, rpl As String) As String
            Return Regex.Replace(targ, rpl, "")
        End Function
    End Module
End Namespace

这是我尝试调用扩展方法的位置以及调用其中一个方法的示例:

Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Collections.Generic
Imports System.Web.UI.HtmlControls
Imports Telerik.Web.UI
Imports System.IO
Imports System.Data.SqlClient
Imports System.Runtime.CompilerServices
Imports Utilities
Imports Utilities.StringExtensions
Imports Utilities.PageOps
Imports Utilities.DBChecks

Public Class UserDashboard
    Inherits System.Web.UI.Page

    '...

    Private Function GetRoleLst(rMap As Collections.Generic.Dictionary(Of String, String)) As List(Of String)
        Dim rLst As New List(Of String)()

        For Each kvp As KeyValuePair(Of String, String) In rMap
            For Each con As Control In ThRolePanel.Controls
                If TypeOf con Is CheckBox Then
                    Dim conID As String = con.ID
                    If DirectCast(con, CheckBox).Checked And conID.RegexRemove("\s") = kvp.Key Then
                        rLst.Add(kvp.Value)
                    End If
                End If
            Next
        Next
    End Function
End Class

我们的 Web.config 文件指向 .net 4.0,并且 System.Core 已添加到程序集列表中。这是编译选项卡:

<compilation debug="true" strict="false" explicit="true" targetFramework="4.0">
      <assemblies>
         <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Data.Entity.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Speech, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="Telerik.ReportViewer.WebForms, Version=8.2.14.1204, Culture=neutral, PublicKeyToken=a9d7983dfcc261be" />
        <add assembly="Telerik.Reporting.Service, Version=8.2.14.1204, Culture=neutral, PublicKeyToken=a9d7983dfcc261be" />
        <add assembly="Telerik.Reporting, Version=8.2.14.1204, Culture=neutral, PublicKeyToken=a9d7983dfcc261be" />
      </assemblies>

      <buildProviders>
        <add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add extension=".edmx" type="System.Data.Entity.Design.AspNet.EntityDesignerBuildProvider" />
      </buildProviders>
    </compilation>

查看了一些 SO 问题、VB 扩展函数指南和 .net 文档,但到目前为止,没有一个可以帮助我解决这个问题。


更新

所以我预感到我尝试通过这样的命名空间访问扩展方法:

Utilities.RegexReplace(con.ID,"\s")

这很有效,但是如果我尝试将它作为字符串的扩展来访问,我仍然会遇到上一个问题,即它报告“RegexReplace”不是字符串错误的成员。由于某种原因,扩展方法似乎实际上并未扩展 String。

【问题讨论】:

  • 你确定扩展方法本身正在编译吗?我注意到除了RegexRemove 方法之外,您完全符合Regex 的条件,并且您没有包含System.Text 命名空间,所以我认为代码本身没有编译。你能发布你的编译器错误吗?
  • @pstrjds 这是一个 asp.net 网站的代码。该站点在运行时自行编译,然后输出错误(如果有)。我看到的错误是“RegexReplace”不是字符串的成员。这也发生在其他两种方法中。这是一个非常古老的应用程序,之前的开发人员离开时删除了项目和解决方案文件,因此我无法在 Vis Studio 中编译它。我发现了一些有趣的东西,请检查我的问题以获取更新。
  • 您已将Extension 属性添加到IsAlphaNumeric,但未添加到IsNumericRegexRemove
  • @Geowil - 你的意思是RegexRemove,因为RegexReplace 不是该扩展类的成员。
  • @jmcilhinney doh!显然今天盯着代码太久了。那解决了它。用它创建一个答案,我会接受它。谢谢。

标签: asp.net vb.net extension-methods


【解决方案1】:

您已将Extension 属性添加到IsAlphaNumeric,但未添加到IsNumericRegexRemove。这个:

<Extension()> _
Public Function IsAlphaNumeric(targ As String) As Boolean
    Return System.Text.RegularExpressions.Regex.IsMatch(targ, "^[a-zA-Z0-9]+$")
End Function

Public Function IsNumeric(targ As String) As Boolean
    Return System.Text.RegularExpressions.Regex.IsMatch(targ, "^[0-9]+$")
End Function

Public Function RegexRemove(targ As String, rpl As String) As String
    Return Regex.Replace(targ, rpl, "")
End Function

应该是这样的:

<Extension()> _
Public Function IsAlphaNumeric(targ As String) As Boolean
    Return System.Text.RegularExpressions.Regex.IsMatch(targ, "^[a-zA-Z0-9]+$")
End Function

<Extension()> _
Public Function IsNumeric(targ As String) As Boolean
    Return System.Text.RegularExpressions.Regex.IsMatch(targ, "^[0-9]+$")
End Function

<Extension()> _
Public Function RegexRemove(targ As String, rpl As String) As String
    Return Regex.Replace(targ, rpl, "")
End Function

【讨论】:

  • &lt;Extension()&gt; 本身也不需要 Module 属性。
  • @AlexKudryashev,但它可以合法应用,所以我想知道这样做是否有任何价值。在一个类型上,它应该表明该类型包含扩展方法,所以我怀疑,如果你将它应用于一个成员,编译器会自动将它应用于该类型。这意味着你自己这样做没有任何价值,而且我不能说我曾经注意到不这样做的不利因素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多