Функция расширения VB.Net не является членом строки - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь объединить некоторые общие функции в нашем приложении asp.net в некоторые методы расширения строки, но я столкнулся с проблемой, когда наш сайт выдает ошибки компилятора, что методы не являются членами String.

Вот определение модуля в созданном мною пространстве утилит:

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 ")

, и это сработало, но если я пытаюсь получить к нему доступ как к расширению String, я все равно получаю предыдущую проблему, в которой сообщается, что" RegexReplace "не является членом ошибки строки.Похоже, что метод расширения на самом деле не расширяет String по какой-то причине.

1 Ответ

0 голосов
/ 05 февраля 2019

Вы добавили атрибут Extension к IsAlphaNumeric, но не к IsNumeric или RegexRemove.Это:

<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
...