【发布时间】:2021-04-17 03:45:43
【问题描述】:
在我的应用程序中,我有一个对象数组, 所有对象的类型将始终相同但未知,但我需要根据某些条件更新数组对象的一个属性
我尝试使用反射来实现与下面相同的功能
Public Shared Sub FilterobjectArray(ByVal obj As Object())
Dim r = obj.Where(Function(x) CStr(x.[GetType]().GetProperty("Id")?.GetValue(x)) = "2")
For Each item In r
Dim propertyInfo As PropertyInfo = item.[GetType]().GetProperty("CompanyName")
propertyInfo.SetValue(item, Convert.ChangeType("MyCompany", propertyInfo.PropertyType), Nothing)
Next
End Sub
问题 我认为过滤数组的 Lambda 表达式是错误的,因为它在 x 中抛出“未设置对象引用”
我的示例实现
公司实体
Public Class Company
Public Property Id As Integer
Public Property CompanyName As String
End Class
实施
Dim comp(2) As Object
Dim comp1 = New Company With {.Id = 1, .CompanyName = "Comp1"}
Dim comp2 = New Company With {.Id = 2, .CompanyName = "Comp2"}
comp(0) = comp1
comp(1) = comp2
FilterobjectArray(comp)
有人可以提出什么问题吗,也欢迎 C# 答案或语法
注意:在 for 循环中第一次迭代后出现错误 即在第一个“propertyInfo.SetValue”完成并且下一次迭代开始之后
【问题讨论】:
-
为什么需要使用反射?你不能简单地使用一个界面来代替吗?
-
因为我们不知道对象的类型,所以我们使用反射来根据属性值进行过滤
-
您没有将任何项目添加到数组中。当您将数组传递给
FilterobjectArray时,该数组具有三个Nothing值。 -
我使用Telerik Code converter 将您的 VB 代码转换为 C#,它确实将其转换为具有 3 个插槽的对象数组。而且它们都没有设置。
-
@SreenathGanga 我会重复彼得的评论。为什么不使用接口?如果您知道属性的名称,那么您已经对类型足够了解。你不需要反思。充其量,您需要过滤不实现接口的对象,例如
OfType<>()
标签: c# arrays vb.net linq reflection