提问人:WSC 提问时间:10/9/2019 更新时间:10/10/2019 访问量:68
类对象属性,它引用相同对象类型的另一个对象实例
Class object property which references another object instance of same object type
问:
我有一个类对象,如下所示:
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
复杂性在于,有时 an 本身没有任何属性,而是具有一个属性,该属性显示“我的所有属性都与此 ID 相同,请检查该对象”。item
.Alias
item
我应该如何编写我的类对象,以便此代码返回“对象 A”:item
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")
我的解决方案是否能从设计中接受,或者有更好的方法来实现这一目标?
答:
1赞
user10216583
10/10/2019
#1
试试这个:
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
评论
0赞
WSC
10/10/2019
不幸的是,这似乎行不通。它仍然返回对象 C。我想知道是否可以像我问题中的函数一样使用一些类似的代码,但在属性 Get 中?GetItemDescription
0赞
WSC
10/10/2019
谢谢,我将把这个标记为答案,因为它确实有效,但是我也发布了我睡着后最终得到的解决方案。它更符合我的要求。
1赞
WSC
10/10/2019
#2
JQSOFT的答案确实实现了类似的效果,但是我后来意识到了一种更精细的方法,可以达到相同的结果。
Private Property _description As String
Public Property Description As String
Get
If _Description = "" Then
If [Alias] IsNot Nothing Then
Return dict.Item([Alias]).Description
Else
Return ""
End If
Else
Return _description
End If
End Get
Set(value As String)
_description = value
End Set
End Property
这种方式允许我指定是否从属性级别返回数据,而不是返回完全不同的对象。Object A
另外,是一个糟糕的属性名称,因为它也是一个关键字,我将使用 ..Alias
.Synonym
评论
2赞
Craig
10/10/2019
这种方法的缺点是,您必须转发每个属性。根据上下文的不同,使用生成的代码而不是手动复制所有内容可能会有所帮助。
1赞
WSC
10/10/2019
这是真的,也是为什么我将 JQSOFT 的版本标记为答案,因为它避免了这一点。这在我的用例中更有用的原因是,当别名存在时,并非所有属性都需要转发。例如,和 可能是唯一的,但可能继承自指定的 .我相信一定有更好的方法来存储这些信息,但它是以这种格式提供的,所以我没有太多选择。.Name
.Description
.Type
.Alias
2赞
Craig
10/10/2019
事实上,有这个缺点并不意味着(正如你所指出的)它不合适。我主要评论指出,生成的代码可以帮助解决有很多样板的情况(如果只转发了两三个属性,那么复制和粘贴更有意义)。
评论