Я пытаюсь объединить некоторые общие функции в нашем приложении 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 по какой-то причине.