You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中使用LINQ结合反射实现多值选择的技术问题

解决方案

首先修正你代码里的基础错误:addressType初始化为Nothing后直接调用Add会触发空引用异常,需要先实例化列表。

要返回包含Type和指定字段(比如Link)的二维列表,只需在Select中同时提取这两个值,而非仅取单个字段。以下是修正后的代码:

' 正确初始化筛选列表
Dim addressType As New List(Of String)()
addressType.Add("Google")
addressType.Add("iCloud")

Dim columnName As String = "Link"
        
' 生成包含Type和指定字段值的二维列表
Dim ResultDataSet = Person.Email _
    .Where(Function(email) addressType.Contains(email.Type)) _
    .Select(Function(email) {
        email.Type, ' 直接取Type属性
        email.GetType().GetProperty(columnName).GetValue(email) ' 动态取指定字段值
    }) _
    .ToList()

代码说明

  • 筛选逻辑:保留原有的Where条件,根据动态加载的addressType列表过滤邮箱类型。
  • 构造二维结构:在Select中使用匿名数组,第一个元素是email.Type,第二个元素通过反射获取指定columnName对应的值,最终得到的ResultDataSet是List(Of Object())类型,每个数组包含一对Type和目标字段值。
  • 强类型替代(如果columnName固定):如果不需要动态指定字段,也可以直接用强类型写法,避免反射,更高效:
    Dim ResultDataSet = Person.Email _
        .Where(Function(email) addressType.Contains(email.Type)) _
        .Select(Function(email) {email.Type, email.Link}) _
        .ToList()
    

额外优化建议

反射操作性能较低,如果需要频繁动态指定字段,可以提前缓存属性信息,避免每次查询都反射:

' 提前获取属性信息
Dim targetProperty = GetType(Email).GetProperty(columnName)
Dim ResultDataSet = Person.Email _
    .Where(Function(email) addressType.Contains(email.Type)) _
    .Select(Function(email) {email.Type, targetProperty.GetValue(email)}) _
    .ToList()

内容的提问来源于stack exchange,提问作者Aiden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:13:18