vb.net - 类对象属性,它引用相同对象类型的另一个对象实例
问题描述
我有一个看起来像这样的类对象:
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")
从设计角度来看,我的解决方案是否可以接受,还是有更好的方法来实现这一点?
解决方案
试试这个:
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
推荐阅读
- azure - 通过服务主体将数据从 Azure EventHub 引入 Azure 数据资源管理器
- python - 在寻找元素方面使用 Selenium 和 Beautiful Soup
- r - 将特定行合并到列中
- vue.js - vuebootstrap b-collapse:侧边栏折叠时,改变margin-left内容div
- c# - 在 IdentityServer4 中覆盖 UserClaimsPrincipalFactory 时出现延迟加载问题
- unity3d - 我们如何在不使用 unity 的内置物理库的情况下检查 gameObject 和 linerenderer 是否发生碰撞?
- pytorch - 如何使用 pytorch 在多个 GPU 上并行化正则化损失计算?
- java - 选择跟踪器实现
- android-recyclerview - ListAdapter 没有类型参数 - 如何在 AndroidX 中创建单独的 ViewHolder 文件?
- c# - 使用 '.AnyIn' 方法为嵌套数组创建 MongoDB Builders 过滤器