Did you ever want to have a ToInteger Method on an object of Type String? Did you ever want to add ofther methods to the various types of System.Object? In VS2008, you now can do that with Extension Methods.
Much of what this article discusses came with the advent of LINQ, which you will hear much of in VS2008, However, I will limit this discussion to extending System.Objects. One of the new features in Visual Studio is Extension Methods, which allows you to extend System.Objects, such as Integers, Strings, etc. In this article, I am going to extend several objects.
First, Extension Methods derive from System.Runtime.CompilerServices and so you have to have an Import of that Namespace. Secondly, Extension Methods must appear in a Module in VB.NET. A module is nothing more than a class of Shared Methods, etc. Therefore, the Extension Methods must have an access level of Public. Thirdly, to create an Extension Method, you must use an Extension Attribute as shown in the code snippet below. Finally since I am going to use a Regular Expression I will need to import System.Text.RegularEcpressions.
I will extend the String Object Type by adding several methods to the methods of a String object. Although these are very simple methods, you will get the picture of how you can extend the methods of the System.Object Namespace objects. Now before you decide to replace all of your utility functions by adding too many methods to the String object in the CLR. You might want to think of what that might do to intellisense.
| Imports System.Object.Runtime.CompilerServices Imports System.Text.RegularExpressions Module Module1 Sub Main() Class1.TestExtensions() End Sub ' Extension Methods <Extension()> _ Public Function IsValidSSN(ByVal ssn As String) As String Return Regex.IsMatch(ssn, "((\d\d\d-\d\d-\d\d\d\d)|(\d{9}))") End Function <Extension()> _ Public Function IsUpper(ByVal s As String) As Boolean Dim m As Match = Regex.Match(s, "^[A-Z]") Return m.Success End Function <Extension()> _ Public Function IsLower(ByVal s As String) As Boolean Return Not s.IsUpper End Function ' This method returns True if the whole string alpha <Extension()> _ Public Function IsAllAlpha(ByVal s As String) As Boolean Dim m As Match = Regex.Match(s, "^[A-Za-z]*") Return s.Length = m.Length End Function ' Create an ToInteger method on an object of type String ' The desire for this method grew out of the extensive use of Val() ' when I was coding in VB6 and the fact that no such method exists in ' pure VB.NET. This method works similiar to Val() in that it stops ' at the first occurrence of a non-numeric character. It will return a ' value of 0 if the first charachter of the string is not numberic. <Extension()> _ Public Function ToInteger(ByVal s As String) As Integer Dim m As Match = Regex.Match(s, "^[0-9]*") If m Is Nothing OrElse m.Length = 0 Then Return 0 Else Return CType(m.Value, Integer) End If End Function <Extension()> _ Public Function EqualsCaseInsensitive(ByVal s1 As String, _ ByVal s2 As String) As Boolean Return s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase) End Function <Extension()> _ Public Shared Function ProperCase(ByVal inputString As String) As String If inputString.Length > 0 Then If (inputString.ToUpper.Equals(inputString)) OrElse _ (inputString.ToLower.Equals(inputString)) Then Dim words() As String = inputString.Split(" ") For i As Integer = 0 To words.Length - 1 If InStr(words(i), ".") = words(i).Length _ OrElse InStr(words(i), ".") = 0 Then Dim word() As String = words(i).Split("-") For j As Integer = 0 To word.Length - 1 If i > 0 Then If "and_of_a_the".IndexOf(word(j)) > -1 Then word(j) = word(j).ToLower Else word(j) = ProperWord(word(j)) End If Else word(j) = ProperWord(word(j)) End If Next words(i) = Join(word, "-") Else If Len(words(i)) = 2 Then words(i) = words(i).ToUpper End If End If Next inputString = Join(words, " ") End If End If Return inputString End Function Private Shared Function ProperWord(ByVal word As String) As String If word.Length > 0 Then If word = word.ToUpper Or word = word.ToLower Then word = word.Substring(0, 1).ToUpper & word.Substring(1).ToLower Else word = word.Substring(0, 1).ToUpper & word.Substring(1) End If If UCase(Left(word, 2)) = "MC" Then word = "Mc" & Mid(word, 3, 1).ToUpper & Mid(word, 4) End If End If Return word End Function End Module |
| Public Class Class1 Public Shared Sub TestExtensions() Debug.Print("That A is upper case is " & "A".IsUpper) Debug.Print("That A is lower case is " & "A".IsLower) Debug.Print("That A = a ignoring case is " & _ "A".EqualsCaseInsensitive("a")) Debug.Print("That abc1d is all alpha is " & "abc1d".IsAllAlpha) Debug.Print("Val of 123a = " & "123a".ToInteger.ToString) Debug.Print("Valid SSN format = " & "123-46-2134".IsValidSSN) Debug.Print("Valid SSN format = " & "123456789".IsValidSSN) Debug.Print("Valid SSN format = " & "12345678".IsValidSSN) Debug.Print("Valid SSN format = " & "123-23-123".IsValidSSN) Debug.Print("Proper case of john MCCULLOUGH = " & _ "john mccullough".ProperCase) End Sub End Class |
| That A is upper case is True That A is lower case is False That A = a ignoring case is True That abc1d is all alpha is False Val of 123a = 123 Valid SSN format = True Valid SSN format = True Valid SSN format = False Valid SSN format = False Proper case of john MCCULLOUGH = John McCullough |
| Ask a Question, or give your feedback on my articles or products by going to the KnowDotNet Forum or by clicking on My Blog. | ![]() |