属性反射 - 如何获取值?

4

我需要动态获取属性及其值。我的代码如下所示,但是它无法正常工作。有人可以帮我一下吗?我已经尝试了许多例子,但目前还没有找到解决方案。

        Dim seriesName As String = s.SeriesName
        If model.Settings.ShowNativeLanguage Then

            Dim propInfo As System.Reflection.PropertyInfo = s.GetType().GetProperty(model.Country)
            seriesName = CStr(propInfo.GetValue(s, Nothing))

        End If

这段代码会产生错误信息:"对象类型不匹配。"

2个回答

4
问题已经在这里得到了回答:使用C#反射时对象不匹配目标类型

解决方法是更改您的代码中的这一行:

seriesName = propInfo.GetValue(propInfo, Nothing).ToString()

转换为:

seriesName = propInfo.GetValue(s, Nothing).ToString()

您需要传递要获取值的对象。(更多信息请参见MSDN) 更新: 您应该始终检查反射结果是否为Nothing。因此,首先将propInfo.GetValue(s, Nothing)的输出存储在临时变量中,然后仅在对象不为Nothing时调用ToString()函数。

是的,根据那个例子我已经尝试过了。不知道为什么会出现“对象引用未设置到对象实例”的错误。请查看我的代码更新。也许"s"对象项目导致它失败了? - prison-mike
你的属性可能返回了 Nothing,请查看我的答案更新。 - peter
seriesName = CStr(propInfo.GetValue(s, Nothing)) 修复了这个问题。 - prison-mike

0
当然应该是:

 ... propInfo.GetValue(s) ...

通常情况下,您必须将表示this实例的对象作为第一个参数传递。您之所以会收到该错误,是因为它期望实例s,而不是PropertyInfo实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接