How to support contextual implicit conversions of custom object in Visual Basic .NET?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







1















I want to use named error codes within my app. This should ensure, that every developer does not confuse numeric-only error codes with other codes, and also reduces the time a developer needs to realize what the error code should represent.



Compare this example:



Function New() As Integer
Return 0
End Function


with this example:



Function New() As Integer
Return ErrorCodes.ERROR_SUCCESS
End Function


Of course, I could let the developers write like the following:



Function New() As Integer
Return 0 ' ERROR_SUCCESS
End Function


However, the code above raises a pitfall when a developer updates the actual return code but forgets about the comment. Some developer look at the actual return code and some at the comment. I want to mitigate that confusion.



I come up the following class (extract):



Public Class ErrorCodes
Private msName As String = Nothing
Private miValue As Integer = 0

Public Shared ReadOnly ERROR_SUCCESS As ErrorCodes = New ErrorCodes("ERROR_SUCCESS", 0)

Private Sub New(ByVal psName As String, ByVal piValue As Integer)
msName = psName
miValue = piValue
End Sub

Public ReadOnly Property [Name] As String
Get
Return msName
End Get
End Property

Public ReadOnly Property [Value] As Integer
Get
Return miValue
End Get
End Property

Public Overrides Function ToString() As String
Return String.Format("[{0}]{1}", msName, miValue)
End Function
End Class


Now I want to use this ErrorCodes class like in the following example:



Function New() As Integer
Return ErrorCodes.ERROR_SUCCESS
End Function


As expected, I will produce an exception (type conversion) since the actual value I return is a instance of the class ErrorCodes instead of the generic data type Integer.



As you can see with the ToString() function, I let the class automatically/implicitly converts the instanced object into the generic data type String, when the class instance is assigned to a String typed variable.



Is there a way to do the same with the generic data type Integer like I did with ToString()?



I am using the .NET Framework 4.0, as for compatibility reasons with Windows XP SP3.



Another way to say what I want:



Dim stringVariable As String = ErrorCodes.ERROR_SUCCESS ' should be "[0]ERROR_SUCCESS".
Dim integerVariable As Integer = ErrorCodes.ERROR_SUCCESS ' should be 0.


I do not want to trigger implicit conversion warnings/errors, or to force the developer to typecast explicitly.










share|improve this question























  • Could you just do "Return ErrorCodes.ERROR_SUCCESS.Value" ?

    – the_lotus
    Jan 3 at 14:57











  • @the_lotus Would be the "last" resort. I try to find an implementation in which the deveoper has to type/read less.

    – burnersk
    Jan 3 at 14:58








  • 5





    It seems to me that you should be using an Enum. They have a numeric value, a text name and, if you want more, you can add a Description attribute. You might check this out.

    – jmcilhinney
    Jan 3 at 15:06




















1















I want to use named error codes within my app. This should ensure, that every developer does not confuse numeric-only error codes with other codes, and also reduces the time a developer needs to realize what the error code should represent.



Compare this example:



Function New() As Integer
Return 0
End Function


with this example:



Function New() As Integer
Return ErrorCodes.ERROR_SUCCESS
End Function


Of course, I could let the developers write like the following:



Function New() As Integer
Return 0 ' ERROR_SUCCESS
End Function


However, the code above raises a pitfall when a developer updates the actual return code but forgets about the comment. Some developer look at the actual return code and some at the comment. I want to mitigate that confusion.



I come up the following class (extract):



Public Class ErrorCodes
Private msName As String = Nothing
Private miValue As Integer = 0

Public Shared ReadOnly ERROR_SUCCESS As ErrorCodes = New ErrorCodes("ERROR_SUCCESS", 0)

Private Sub New(ByVal psName As String, ByVal piValue As Integer)
msName = psName
miValue = piValue
End Sub

Public ReadOnly Property [Name] As String
Get
Return msName
End Get
End Property

Public ReadOnly Property [Value] As Integer
Get
Return miValue
End Get
End Property

Public Overrides Function ToString() As String
Return String.Format("[{0}]{1}", msName, miValue)
End Function
End Class


Now I want to use this ErrorCodes class like in the following example:



Function New() As Integer
Return ErrorCodes.ERROR_SUCCESS
End Function


As expected, I will produce an exception (type conversion) since the actual value I return is a instance of the class ErrorCodes instead of the generic data type Integer.



As you can see with the ToString() function, I let the class automatically/implicitly converts the instanced object into the generic data type String, when the class instance is assigned to a String typed variable.



Is there a way to do the same with the generic data type Integer like I did with ToString()?



I am using the .NET Framework 4.0, as for compatibility reasons with Windows XP SP3.



Another way to say what I want:



Dim stringVariable As String = ErrorCodes.ERROR_SUCCESS ' should be "[0]ERROR_SUCCESS".
Dim integerVariable As Integer = ErrorCodes.ERROR_SUCCESS ' should be 0.


I do not want to trigger implicit conversion warnings/errors, or to force the developer to typecast explicitly.










share|improve this question























  • Could you just do "Return ErrorCodes.ERROR_SUCCESS.Value" ?

    – the_lotus
    Jan 3 at 14:57











  • @the_lotus Would be the "last" resort. I try to find an implementation in which the deveoper has to type/read less.

    – burnersk
    Jan 3 at 14:58








  • 5





    It seems to me that you should be using an Enum. They have a numeric value, a text name and, if you want more, you can add a Description attribute. You might check this out.

    – jmcilhinney
    Jan 3 at 15:06
















1












1








1








I want to use named error codes within my app. This should ensure, that every developer does not confuse numeric-only error codes with other codes, and also reduces the time a developer needs to realize what the error code should represent.



Compare this example:



Function New() As Integer
Return 0
End Function


with this example:



Function New() As Integer
Return ErrorCodes.ERROR_SUCCESS
End Function


Of course, I could let the developers write like the following:



Function New() As Integer
Return 0 ' ERROR_SUCCESS
End Function


However, the code above raises a pitfall when a developer updates the actual return code but forgets about the comment. Some developer look at the actual return code and some at the comment. I want to mitigate that confusion.



I come up the following class (extract):



Public Class ErrorCodes
Private msName As String = Nothing
Private miValue As Integer = 0

Public Shared ReadOnly ERROR_SUCCESS As ErrorCodes = New ErrorCodes("ERROR_SUCCESS", 0)

Private Sub New(ByVal psName As String, ByVal piValue As Integer)
msName = psName
miValue = piValue
End Sub

Public ReadOnly Property [Name] As String
Get
Return msName
End Get
End Property

Public ReadOnly Property [Value] As Integer
Get
Return miValue
End Get
End Property

Public Overrides Function ToString() As String
Return String.Format("[{0}]{1}", msName, miValue)
End Function
End Class


Now I want to use this ErrorCodes class like in the following example:



Function New() As Integer
Return ErrorCodes.ERROR_SUCCESS
End Function


As expected, I will produce an exception (type conversion) since the actual value I return is a instance of the class ErrorCodes instead of the generic data type Integer.



As you can see with the ToString() function, I let the class automatically/implicitly converts the instanced object into the generic data type String, when the class instance is assigned to a String typed variable.



Is there a way to do the same with the generic data type Integer like I did with ToString()?



I am using the .NET Framework 4.0, as for compatibility reasons with Windows XP SP3.



Another way to say what I want:



Dim stringVariable As String = ErrorCodes.ERROR_SUCCESS ' should be "[0]ERROR_SUCCESS".
Dim integerVariable As Integer = ErrorCodes.ERROR_SUCCESS ' should be 0.


I do not want to trigger implicit conversion warnings/errors, or to force the developer to typecast explicitly.










share|improve this question














I want to use named error codes within my app. This should ensure, that every developer does not confuse numeric-only error codes with other codes, and also reduces the time a developer needs to realize what the error code should represent.



Compare this example:



Function New() As Integer
Return 0
End Function


with this example:



Function New() As Integer
Return ErrorCodes.ERROR_SUCCESS
End Function


Of course, I could let the developers write like the following:



Function New() As Integer
Return 0 ' ERROR_SUCCESS
End Function


However, the code above raises a pitfall when a developer updates the actual return code but forgets about the comment. Some developer look at the actual return code and some at the comment. I want to mitigate that confusion.



I come up the following class (extract):



Public Class ErrorCodes
Private msName As String = Nothing
Private miValue As Integer = 0

Public Shared ReadOnly ERROR_SUCCESS As ErrorCodes = New ErrorCodes("ERROR_SUCCESS", 0)

Private Sub New(ByVal psName As String, ByVal piValue As Integer)
msName = psName
miValue = piValue
End Sub

Public ReadOnly Property [Name] As String
Get
Return msName
End Get
End Property

Public ReadOnly Property [Value] As Integer
Get
Return miValue
End Get
End Property

Public Overrides Function ToString() As String
Return String.Format("[{0}]{1}", msName, miValue)
End Function
End Class


Now I want to use this ErrorCodes class like in the following example:



Function New() As Integer
Return ErrorCodes.ERROR_SUCCESS
End Function


As expected, I will produce an exception (type conversion) since the actual value I return is a instance of the class ErrorCodes instead of the generic data type Integer.



As you can see with the ToString() function, I let the class automatically/implicitly converts the instanced object into the generic data type String, when the class instance is assigned to a String typed variable.



Is there a way to do the same with the generic data type Integer like I did with ToString()?



I am using the .NET Framework 4.0, as for compatibility reasons with Windows XP SP3.



Another way to say what I want:



Dim stringVariable As String = ErrorCodes.ERROR_SUCCESS ' should be "[0]ERROR_SUCCESS".
Dim integerVariable As Integer = ErrorCodes.ERROR_SUCCESS ' should be 0.


I do not want to trigger implicit conversion warnings/errors, or to force the developer to typecast explicitly.







vb.net object casting






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Jan 3 at 14:54









burnerskburnersk

1,16621536




1,16621536













  • Could you just do "Return ErrorCodes.ERROR_SUCCESS.Value" ?

    – the_lotus
    Jan 3 at 14:57











  • @the_lotus Would be the "last" resort. I try to find an implementation in which the deveoper has to type/read less.

    – burnersk
    Jan 3 at 14:58








  • 5





    It seems to me that you should be using an Enum. They have a numeric value, a text name and, if you want more, you can add a Description attribute. You might check this out.

    – jmcilhinney
    Jan 3 at 15:06





















  • Could you just do "Return ErrorCodes.ERROR_SUCCESS.Value" ?

    – the_lotus
    Jan 3 at 14:57











  • @the_lotus Would be the "last" resort. I try to find an implementation in which the deveoper has to type/read less.

    – burnersk
    Jan 3 at 14:58








  • 5





    It seems to me that you should be using an Enum. They have a numeric value, a text name and, if you want more, you can add a Description attribute. You might check this out.

    – jmcilhinney
    Jan 3 at 15:06



















Could you just do "Return ErrorCodes.ERROR_SUCCESS.Value" ?

– the_lotus
Jan 3 at 14:57





Could you just do "Return ErrorCodes.ERROR_SUCCESS.Value" ?

– the_lotus
Jan 3 at 14:57













@the_lotus Would be the "last" resort. I try to find an implementation in which the deveoper has to type/read less.

– burnersk
Jan 3 at 14:58







@the_lotus Would be the "last" resort. I try to find an implementation in which the deveoper has to type/read less.

– burnersk
Jan 3 at 14:58






5




5





It seems to me that you should be using an Enum. They have a numeric value, a text name and, if you want more, you can add a Description attribute. You might check this out.

– jmcilhinney
Jan 3 at 15:06







It seems to me that you should be using an Enum. They have a numeric value, a text name and, if you want more, you can add a Description attribute. You might check this out.

– jmcilhinney
Jan 3 at 15:06














2 Answers
2






active

oldest

votes


















2














Yes you can do that with the use of Conversion Operators.
Here is the code:



Public Class Form1
Public Class ErrorCodes
Private msName As String = Nothing
Private miValue As Integer = 0

Public Shared Widening Operator CType(ByVal ec As ErrorCodes) As String
Return ec.ToString
End Operator

Public Shared Narrowing Operator CType(ByVal ec As ErrorCodes) As Integer
Return ec.Value
End Operator

Public Shared ReadOnly ERROR_SUCCESS As ErrorCodes = New ErrorCodes("ERROR_SUCCESS", 0)
Public Shared ReadOnly ERROR_FAILED As ErrorCodes = New ErrorCodes("ERROR_FAILED", 1)

Private Sub New(ByVal psName As String, ByVal piValue As Integer)
msName = psName
miValue = piValue
End Sub

Public ReadOnly Property [Name] As String
Get
Return msName
End Get
End Property

Public ReadOnly Property [Value] As Integer
Get
Return miValue
End Get
End Property

Public Overrides Function ToString() As String
Return String.Format("[{0}]{1}", msName, miValue)
End Function
End Class

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim em As String = ErrorCodes.ERROR_SUCCESS
Dim ev As Integer = ErrorCodes.ERROR_SUCCESS
Dim mm As String = String.Format("String: {0}, Value: {1}", em, ev)

MsgBox(mm)
End Sub
End Class


More info here



Hope this helps.






share|improve this answer































    2














    This, as jmcilhinney pointed out, uses Enums and the Description attribute.



    Here is the class



    'requires
    ' Imports System.Reflection
    ' Imports System.ComponentModel
    Public Class ErrorCodes
    Public Enum ErrCode 'these are the error codes
    'note that the codes should be unique
    <Description("Success")> ERROR_SUCCESS = 0
    <Description("Error A")> ERROR_A = 1
    End Enum

    Public Class InfoForErrCode
    Public TheDescription As String
    Public TheValue As Integer
    Public AsString As String
    End Class

    Public Shared Function Info(TheError As ErrCode) As InfoForErrCode
    Dim rv As New InfoForErrCode
    rv.TheDescription = GetDescription(TheError)
    rv.TheValue = TheError
    rv.AsString = TheError.ToString
    Return rv
    End Function

    Private Shared Function GetDescription(TheError As ErrCode) As String
    Dim rv As String = ""
    Dim fi As FieldInfo = TheError.GetType().GetField(TheError.ToString())

    Dim attr() As DescriptionAttribute
    attr = DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute),
    False), DescriptionAttribute())

    If attr.Length > 0 Then
    rv = attr(0).Description
    Else
    rv = TheError.ToString()
    End If
    Return rv
    End Function
    End Class


    And here is how it can be used



        Dim foo As ErrorCodes.ErrCode = ErrorCodes.ErrCode.ERROR_SUCCESS
    Dim inf As ErrorCodes.InfoForErrCode = ErrorCodes.Info(foo)
    Stop 'examine inf
    foo = ErrorCodes.ErrCode.ERROR_A
    inf = ErrorCodes.Info(foo)
    Stop 'examine inf





    share|improve this answer
























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54024710%2fhow-to-support-contextual-implicit-conversions-of-custom-object-in-visual-basic%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      2














      Yes you can do that with the use of Conversion Operators.
      Here is the code:



      Public Class Form1
      Public Class ErrorCodes
      Private msName As String = Nothing
      Private miValue As Integer = 0

      Public Shared Widening Operator CType(ByVal ec As ErrorCodes) As String
      Return ec.ToString
      End Operator

      Public Shared Narrowing Operator CType(ByVal ec As ErrorCodes) As Integer
      Return ec.Value
      End Operator

      Public Shared ReadOnly ERROR_SUCCESS As ErrorCodes = New ErrorCodes("ERROR_SUCCESS", 0)
      Public Shared ReadOnly ERROR_FAILED As ErrorCodes = New ErrorCodes("ERROR_FAILED", 1)

      Private Sub New(ByVal psName As String, ByVal piValue As Integer)
      msName = psName
      miValue = piValue
      End Sub

      Public ReadOnly Property [Name] As String
      Get
      Return msName
      End Get
      End Property

      Public ReadOnly Property [Value] As Integer
      Get
      Return miValue
      End Get
      End Property

      Public Overrides Function ToString() As String
      Return String.Format("[{0}]{1}", msName, miValue)
      End Function
      End Class

      Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      Dim em As String = ErrorCodes.ERROR_SUCCESS
      Dim ev As Integer = ErrorCodes.ERROR_SUCCESS
      Dim mm As String = String.Format("String: {0}, Value: {1}", em, ev)

      MsgBox(mm)
      End Sub
      End Class


      More info here



      Hope this helps.






      share|improve this answer




























        2














        Yes you can do that with the use of Conversion Operators.
        Here is the code:



        Public Class Form1
        Public Class ErrorCodes
        Private msName As String = Nothing
        Private miValue As Integer = 0

        Public Shared Widening Operator CType(ByVal ec As ErrorCodes) As String
        Return ec.ToString
        End Operator

        Public Shared Narrowing Operator CType(ByVal ec As ErrorCodes) As Integer
        Return ec.Value
        End Operator

        Public Shared ReadOnly ERROR_SUCCESS As ErrorCodes = New ErrorCodes("ERROR_SUCCESS", 0)
        Public Shared ReadOnly ERROR_FAILED As ErrorCodes = New ErrorCodes("ERROR_FAILED", 1)

        Private Sub New(ByVal psName As String, ByVal piValue As Integer)
        msName = psName
        miValue = piValue
        End Sub

        Public ReadOnly Property [Name] As String
        Get
        Return msName
        End Get
        End Property

        Public ReadOnly Property [Value] As Integer
        Get
        Return miValue
        End Get
        End Property

        Public Overrides Function ToString() As String
        Return String.Format("[{0}]{1}", msName, miValue)
        End Function
        End Class

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim em As String = ErrorCodes.ERROR_SUCCESS
        Dim ev As Integer = ErrorCodes.ERROR_SUCCESS
        Dim mm As String = String.Format("String: {0}, Value: {1}", em, ev)

        MsgBox(mm)
        End Sub
        End Class


        More info here



        Hope this helps.






        share|improve this answer


























          2












          2








          2







          Yes you can do that with the use of Conversion Operators.
          Here is the code:



          Public Class Form1
          Public Class ErrorCodes
          Private msName As String = Nothing
          Private miValue As Integer = 0

          Public Shared Widening Operator CType(ByVal ec As ErrorCodes) As String
          Return ec.ToString
          End Operator

          Public Shared Narrowing Operator CType(ByVal ec As ErrorCodes) As Integer
          Return ec.Value
          End Operator

          Public Shared ReadOnly ERROR_SUCCESS As ErrorCodes = New ErrorCodes("ERROR_SUCCESS", 0)
          Public Shared ReadOnly ERROR_FAILED As ErrorCodes = New ErrorCodes("ERROR_FAILED", 1)

          Private Sub New(ByVal psName As String, ByVal piValue As Integer)
          msName = psName
          miValue = piValue
          End Sub

          Public ReadOnly Property [Name] As String
          Get
          Return msName
          End Get
          End Property

          Public ReadOnly Property [Value] As Integer
          Get
          Return miValue
          End Get
          End Property

          Public Overrides Function ToString() As String
          Return String.Format("[{0}]{1}", msName, miValue)
          End Function
          End Class

          Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
          Dim em As String = ErrorCodes.ERROR_SUCCESS
          Dim ev As Integer = ErrorCodes.ERROR_SUCCESS
          Dim mm As String = String.Format("String: {0}, Value: {1}", em, ev)

          MsgBox(mm)
          End Sub
          End Class


          More info here



          Hope this helps.






          share|improve this answer













          Yes you can do that with the use of Conversion Operators.
          Here is the code:



          Public Class Form1
          Public Class ErrorCodes
          Private msName As String = Nothing
          Private miValue As Integer = 0

          Public Shared Widening Operator CType(ByVal ec As ErrorCodes) As String
          Return ec.ToString
          End Operator

          Public Shared Narrowing Operator CType(ByVal ec As ErrorCodes) As Integer
          Return ec.Value
          End Operator

          Public Shared ReadOnly ERROR_SUCCESS As ErrorCodes = New ErrorCodes("ERROR_SUCCESS", 0)
          Public Shared ReadOnly ERROR_FAILED As ErrorCodes = New ErrorCodes("ERROR_FAILED", 1)

          Private Sub New(ByVal psName As String, ByVal piValue As Integer)
          msName = psName
          miValue = piValue
          End Sub

          Public ReadOnly Property [Name] As String
          Get
          Return msName
          End Get
          End Property

          Public ReadOnly Property [Value] As Integer
          Get
          Return miValue
          End Get
          End Property

          Public Overrides Function ToString() As String
          Return String.Format("[{0}]{1}", msName, miValue)
          End Function
          End Class

          Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
          Dim em As String = ErrorCodes.ERROR_SUCCESS
          Dim ev As Integer = ErrorCodes.ERROR_SUCCESS
          Dim mm As String = String.Format("String: {0}, Value: {1}", em, ev)

          MsgBox(mm)
          End Sub
          End Class


          More info here



          Hope this helps.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Jan 3 at 16:31









          ChristosChristos

          2,40531830




          2,40531830

























              2














              This, as jmcilhinney pointed out, uses Enums and the Description attribute.



              Here is the class



              'requires
              ' Imports System.Reflection
              ' Imports System.ComponentModel
              Public Class ErrorCodes
              Public Enum ErrCode 'these are the error codes
              'note that the codes should be unique
              <Description("Success")> ERROR_SUCCESS = 0
              <Description("Error A")> ERROR_A = 1
              End Enum

              Public Class InfoForErrCode
              Public TheDescription As String
              Public TheValue As Integer
              Public AsString As String
              End Class

              Public Shared Function Info(TheError As ErrCode) As InfoForErrCode
              Dim rv As New InfoForErrCode
              rv.TheDescription = GetDescription(TheError)
              rv.TheValue = TheError
              rv.AsString = TheError.ToString
              Return rv
              End Function

              Private Shared Function GetDescription(TheError As ErrCode) As String
              Dim rv As String = ""
              Dim fi As FieldInfo = TheError.GetType().GetField(TheError.ToString())

              Dim attr() As DescriptionAttribute
              attr = DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute),
              False), DescriptionAttribute())

              If attr.Length > 0 Then
              rv = attr(0).Description
              Else
              rv = TheError.ToString()
              End If
              Return rv
              End Function
              End Class


              And here is how it can be used



                  Dim foo As ErrorCodes.ErrCode = ErrorCodes.ErrCode.ERROR_SUCCESS
              Dim inf As ErrorCodes.InfoForErrCode = ErrorCodes.Info(foo)
              Stop 'examine inf
              foo = ErrorCodes.ErrCode.ERROR_A
              inf = ErrorCodes.Info(foo)
              Stop 'examine inf





              share|improve this answer




























                2














                This, as jmcilhinney pointed out, uses Enums and the Description attribute.



                Here is the class



                'requires
                ' Imports System.Reflection
                ' Imports System.ComponentModel
                Public Class ErrorCodes
                Public Enum ErrCode 'these are the error codes
                'note that the codes should be unique
                <Description("Success")> ERROR_SUCCESS = 0
                <Description("Error A")> ERROR_A = 1
                End Enum

                Public Class InfoForErrCode
                Public TheDescription As String
                Public TheValue As Integer
                Public AsString As String
                End Class

                Public Shared Function Info(TheError As ErrCode) As InfoForErrCode
                Dim rv As New InfoForErrCode
                rv.TheDescription = GetDescription(TheError)
                rv.TheValue = TheError
                rv.AsString = TheError.ToString
                Return rv
                End Function

                Private Shared Function GetDescription(TheError As ErrCode) As String
                Dim rv As String = ""
                Dim fi As FieldInfo = TheError.GetType().GetField(TheError.ToString())

                Dim attr() As DescriptionAttribute
                attr = DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute),
                False), DescriptionAttribute())

                If attr.Length > 0 Then
                rv = attr(0).Description
                Else
                rv = TheError.ToString()
                End If
                Return rv
                End Function
                End Class


                And here is how it can be used



                    Dim foo As ErrorCodes.ErrCode = ErrorCodes.ErrCode.ERROR_SUCCESS
                Dim inf As ErrorCodes.InfoForErrCode = ErrorCodes.Info(foo)
                Stop 'examine inf
                foo = ErrorCodes.ErrCode.ERROR_A
                inf = ErrorCodes.Info(foo)
                Stop 'examine inf





                share|improve this answer


























                  2












                  2








                  2







                  This, as jmcilhinney pointed out, uses Enums and the Description attribute.



                  Here is the class



                  'requires
                  ' Imports System.Reflection
                  ' Imports System.ComponentModel
                  Public Class ErrorCodes
                  Public Enum ErrCode 'these are the error codes
                  'note that the codes should be unique
                  <Description("Success")> ERROR_SUCCESS = 0
                  <Description("Error A")> ERROR_A = 1
                  End Enum

                  Public Class InfoForErrCode
                  Public TheDescription As String
                  Public TheValue As Integer
                  Public AsString As String
                  End Class

                  Public Shared Function Info(TheError As ErrCode) As InfoForErrCode
                  Dim rv As New InfoForErrCode
                  rv.TheDescription = GetDescription(TheError)
                  rv.TheValue = TheError
                  rv.AsString = TheError.ToString
                  Return rv
                  End Function

                  Private Shared Function GetDescription(TheError As ErrCode) As String
                  Dim rv As String = ""
                  Dim fi As FieldInfo = TheError.GetType().GetField(TheError.ToString())

                  Dim attr() As DescriptionAttribute
                  attr = DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute),
                  False), DescriptionAttribute())

                  If attr.Length > 0 Then
                  rv = attr(0).Description
                  Else
                  rv = TheError.ToString()
                  End If
                  Return rv
                  End Function
                  End Class


                  And here is how it can be used



                      Dim foo As ErrorCodes.ErrCode = ErrorCodes.ErrCode.ERROR_SUCCESS
                  Dim inf As ErrorCodes.InfoForErrCode = ErrorCodes.Info(foo)
                  Stop 'examine inf
                  foo = ErrorCodes.ErrCode.ERROR_A
                  inf = ErrorCodes.Info(foo)
                  Stop 'examine inf





                  share|improve this answer













                  This, as jmcilhinney pointed out, uses Enums and the Description attribute.



                  Here is the class



                  'requires
                  ' Imports System.Reflection
                  ' Imports System.ComponentModel
                  Public Class ErrorCodes
                  Public Enum ErrCode 'these are the error codes
                  'note that the codes should be unique
                  <Description("Success")> ERROR_SUCCESS = 0
                  <Description("Error A")> ERROR_A = 1
                  End Enum

                  Public Class InfoForErrCode
                  Public TheDescription As String
                  Public TheValue As Integer
                  Public AsString As String
                  End Class

                  Public Shared Function Info(TheError As ErrCode) As InfoForErrCode
                  Dim rv As New InfoForErrCode
                  rv.TheDescription = GetDescription(TheError)
                  rv.TheValue = TheError
                  rv.AsString = TheError.ToString
                  Return rv
                  End Function

                  Private Shared Function GetDescription(TheError As ErrCode) As String
                  Dim rv As String = ""
                  Dim fi As FieldInfo = TheError.GetType().GetField(TheError.ToString())

                  Dim attr() As DescriptionAttribute
                  attr = DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute),
                  False), DescriptionAttribute())

                  If attr.Length > 0 Then
                  rv = attr(0).Description
                  Else
                  rv = TheError.ToString()
                  End If
                  Return rv
                  End Function
                  End Class


                  And here is how it can be used



                      Dim foo As ErrorCodes.ErrCode = ErrorCodes.ErrCode.ERROR_SUCCESS
                  Dim inf As ErrorCodes.InfoForErrCode = ErrorCodes.Info(foo)
                  Stop 'examine inf
                  foo = ErrorCodes.ErrCode.ERROR_A
                  inf = ErrorCodes.Info(foo)
                  Stop 'examine inf






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Jan 3 at 16:26









                  dbasnettdbasnett

                  8,32822029




                  8,32822029






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54024710%2fhow-to-support-contextual-implicit-conversions-of-custom-object-in-visual-basic%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      MongoDB - Not Authorized To Execute Command

                      How to fix TextFormField cause rebuild widget in Flutter

                      Npm cannot find a required file even through it is in the searched directory