As you all know, we have lots of controlled string values in the
system. We wish we could define them in the same way we defined
controlled numeric values, Enum.
Since it is not possible as Enum type cannot Inherit from string
type. We settle with something not ideal.
If we really want to make it a controlled list, we make a
class full of constaint values. An example will be
DataEntities.Common.VehicleBodyStyle.
If we take a easy way out, we sacrifice the controllibliblty and
define a list of constants in DataEntities.Common namespace and use some kind of
prefix for the name of constants. A good example will be IRP Web Service
Constants.
Public Const IRP_MODEL_TYPE_ROAD_TRACTOR As String = "RT"
Public Const IRP_MODEL_TYPE_TRUCK As String = "TK"
Public Const IRP_MODEL_TYPE_TRACTOR As String = "TR"
Public Const IRP_MODEL_TYPE_TRUCK_TRACTOR As String = "TT"
Public Const IRP_MODEL_TYPE_WRECKER As String = "WR"
Public Const IRP_MODEL_TYPE_WRECKER_PLUS As String = "WK"
Public Const IRP_MODEL_TYPE_BUS As String = "BU"
Public Const IRP_MODEL_TYPE_MOBILE_HOME_TOTER As String = "MT"
If we take a closer look at Enum type. Each enum value has a name
in string, and a value in numeric ( int16, Int32, or Int64). Some time, if we do
not care about the numeric value of the enum value, we just let the compiler
take care of it… if we want it to have some string value, we could name the Enum
after the string Values we want it to be. However, there are 2 problems with
this approach 1) by doing so, we may have to sacrifice some readiblity, 2)
what if there are some spaces in the string value we want to
us.
Well, I did some research on it and I figured a way to assign a
string value to each enum type value in addition of it numical value and the
name.
The solution consits one small class and 2 extended
methods.
StringValueAttribute class
made it possible to provide a string value for each enum value.
GetEnumValue (of T) method
convert a string value to a enum value based on the string value set in its enum
definition.
GetStringValue method
retrieve the string value from a enum value…
Enough talking, let’s take a
look at some code.
This is how we define enum
type with String Value:
Public Enum VehicleBodyStyles
<StringValue("PU")>
PickUp
<StringValue("VA")>
Van
<StringValue("2D")>
TwoDoor
<StringValue("4D")>
FourDoor
<StringValue("AM")>
Ambulance
<StringValue("BU")>
Bus
<StringValue("CN")>
Cnvertbl
<StringValue("DM")>
Dump
<StringValue("HR")>
Hearse
<StringValue("IN")>
Incmplt
<StringValue("LS")>
LowSpeed
<StringValue("MC")>
Mtrcycle
<StringValue("ME")> MotorizedHome
<StringValue("MX")>
Mixer
<StringValue("PC")>
ParkCamper
<StringValue("PN")>
Panel
<StringValue("RD")>
RoadSter
<StringValue("SW")>
StakeOrRack
<StringValue("BU")>
StationWagon
<StringValue("TC")>
TrialerCoach
<StringValue("TK")>
Tank
<StringValue("TR")>
Trailer
<StringValue("TT")>
Tractor
<StringValue("UT")>
Utility
<StringValue("2W")>
TwoWheel
<StringValue("3W")>
ThreeWheel
<StringValue("MW")>
MultipleWheel
<StringValue("AI")>
Air
<StringValue("TV")>
TrackVehicle
<StringValue("MH")>
MobileHome
<StringValue("PM")>
ParkModel
<StringValue("WR")>
TowTruckOrWrecker
<StringValue("24")>
Camper
<StringValue("MP")>
Moped
<StringValue("SM")>
SnowMobile
<StringValue("RT")>
RoadTractor
<StringValue("WR")>
Wrecker
<StringValue("WK")>
WreckerPlus
<StringValue("MT")>
MobileHomeToter
End Enum
This unit test shows you how
to convert string value to enum value and how to retreive string value from a
enum value:
<TestMethod()> Public Sub
StringValueTest()
Dim vehicleBodyStyle As VehicleBodyStyles
Dim myStringValue = "BU"
Assert.IsTrue(myStringValue.IsMember(Of VehicleBodyStyles)()) vehicleBodyStyle = myStringValue.GetEnumValue(Of
VehicleBodyStyles)()
Assert.AreEqual(VehicleBodyStyles.Bus, vehicleBodyStyle)
Assert.AreEqual(myStringValue,
vehicleBodyStyle.GetStringValue())
Assert.AreEqual(5,
DirectCast(vehicleBodyStyle, Int32))
Assert.AreEqual("Bus",
vehicleBodyStyle.ToString()) myStringValue = "Van"
Assert.IsTrue(myStringValue.IsMember(Of VehicleBodyStyles)()) myStringValue = "Something"
Assert.IsFalse(myStringValue.IsMemberOf(Of VehicleBodyStyles)())
Assert.IsTrue(myStringValue.IsMember(Of VehicleBodyStyles)()) myStringValue = "Something"
Assert.IsFalse(myStringValue.IsMemberOf(Of VehicleBodyStyles)())
End Sub
Dim flashTypeIntegerValue As Int32 = 5
Dim flashTypeEnumValue As FlashType
flashTypeEnumValue = DirectCast(flashTypeIntegerValue, FlashType)
Assert.AreEqual(FlashType.Type5, flashTypeEnumValue)
Assert.AreEqual("05", flashTypeEnumValue.GetStringValue())
Assert.AreEqual("05", DirectCast(flashTypeIntegerValue, FlashType).GetStringValue())
flashTypeIntegerValue = 12
flashTypeEnumValue = DirectCast(flashTypeIntegerValue, FlashType)
Assert.AreEqual(FlashType.Type13, flashTypeEnumValue)
Assert.AreEqual("13", flashTypeEnumValue.GetStringValue())
End Sub
No comments:
Post a Comment