首页 > 解决方案 > 类对象属性,它引用相同对象类型的另一个对象实例

问题描述

我有一个看起来像这样的类对象:

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

我目前将这些存储为这样的字典:

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

复杂之处在于,有时 anitem本身没有任何属性,而是有一个.Alias属性,上面写着“我的所有属性都item与此 ID 相同,请改为检查该对象”。

我应该如何编写我的类对象item,以便此代码返回“对象 A”:

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

对象 C 是对象 A 的别名,因此我应该为对象 A 而不是返回一些属性(并非总是全部)Nothing

解决此问题的一种方法是将以下函数添加到Items类中:

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

但是,这感觉不是正确的方法,因为我必须重复调用一组Items.GetPropertyXYZ函数而不是直接引用对象(例如item.Description,必须是GetItemDescription("C")

从设计角度来看,我的解决方案是否可以接受,还是有更好的方法来实现这一点?

标签: vb.net

解决方案


试试这个:

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

编辑 1

当然它会返回“C”项,因为它是错误的。对不起。

这个有效(已测试):

Public Function GetItem(ByVal ID As String) As item
    Dim itm As item = dict.Where(Function(a) a.Key = ID).Select(Function(b) b.Value).FirstOrDefault

    Return If(itm IsNot Nothing, If(itm.Alias IsNot Nothing, dict(itm.Alias), itm), Nothing)
End Function

推荐阅读