Class object property which references another object instance of same object type

by WSC   Last Updated October 09, 2019 17:26 PM

I have a class object which looks like this:

Public Class item
    Public Property ID
    Public Property Name
    Public Property Description
    Public Property Type
    Public Property Alias
End Class

I am currently storing these as a dictionary like this:

Public Class Items

    Public ReadOnly dict Dictionary(Of String, item) From {
        {"A", New item With {.Name = "Object A", .Description = "Object A description"}},
        {"B", New item With {.Name = "Object B", .Description = "Object B description"}},
        {"C", New item With {.Alias = "A"}}
    }

    Public Function GetItem(ByVal ID As String) As item
        Return If(dict.ContainsKey(ID), idct.Item(ID), Nothing)
    End Function

End Class

The complexity is that sometimes an item will not have any properties itself but instead has an .Alias property which says "All of my properties are the same as item with this ID, check that object instead".

How should I write my class object item so that this code returns "Object A":

Dim newItem As item = GetItem("C")
Debug.WriteLine(item.Name)

Object C is an alias of Object A so I should return some properties (not always all of them) for Object A instead of Nothing.

A way around this is by adding the below function to the Items class:

Public Function GetItemDescription(ByVal ID As String) As String
    If dict.ContainsKey(ID) Then
        If dict.Item(ID).Description = "" Then
            Return GetItemDescription(dict.Item(ID).Alias)
        Else
            Return dict.Item(ID).Description
        End If
    Else
        Return ""
    End If
End Function

However this doesn't feel like the correct way as then I have to repeatedly call a set of Items.GetPropertyXYZ functions rather than directly referencing the object (e.g. item.Description would have to be GetItemDescription("C")

Is my solution acceptable from a design persepctive, or is there a better way to achieve this?

Tags : vb.net


Answers 1


Try this:

Public Function GetItem(ByVal [alias] As String) As item
    Return dict.Where(Function(a) a.Key = [alias]).Select(Function(b) b.Value).FirstOrDefault
End Function
JQSOFT
JQSOFT
October 09, 2019 17:25 PM

Related Questions