调用GetValue方法遇参数过多及返回值为空的VB.NET技术问题
解决GetValue泛型调用错误及返回Nothing的问题
初始错误原因
你一开始调用GetValue(renderMaterial)报错,是因为这个泛型方法GetValue(Of T)()不需要参数,你多传了renderMaterial参数,所以触发「参数过多」的错误。
更新后返回Nothing的原因
你改成GetValue(Of Field)后编译通过,但返回空值,是因为泛型类型不匹配:GetValue(Of T)需要传入具体的字段子类类型(比如DoubleField或Color4fField),而不是基类Field。用基类的话,方法无法正确返回对应子类的实例,所以得到Nothing。
修正方案
方案1:直接针对具体字段类型处理(简单直观)
直接判断字段的实际类型,调用对应类型的泛型GetValue方法:
Try Dim field = renderMaterial?.Fields?.GetField(slotName) If field IsNot Nothing Then ' 处理DoubleField类型 If TypeOf field Is DoubleField Then Dim doubleField = DirectCast(field, DoubleField) If doubleField.HasValue Then _Attributes.Number = doubleField.GetValue(Of Double)() End If ' 处理Color4fField类型 ElseIf TypeOf field Is Color4fField Then Dim colorField = DirectCast(field, Color4fField) If colorField.HasValue Then _Attributes.Color = colorField.GetValue(Of Color4f)().SystemColorValue End If End If End If Catch ex As Exception ' 添加具体的异常处理逻辑,比如日志输出 End Try
方案2:反射动态调用泛型方法(支持扩展更多字段类型)
如果后续需要支持更多字段类型,用反射动态匹配泛型类型调用:
Try Dim field = renderMaterial?.Fields?.GetField(slotName) If field IsNot Nothing Then Dim fieldType = field.GetType() ' 获取字段对应的泛型值类型(比如DoubleField对应Double) Dim valueType = fieldType.GetGenericArguments()(0) ' 动态构建并调用GetValue泛型方法 Dim getValueMethod = fieldType.GetMethod("GetValue", Type.EmptyTypes)?.MakeGenericMethod(valueType) If getValueMethod IsNot Nothing Then Dim fieldValue = getValueMethod.Invoke(field, Nothing) If TypeOf field Is DoubleField Then _Attributes.Number = DirectCast(fieldValue, Double) ElseIf TypeOf field Is Color4fField Then _Attributes.Color = DirectCast(fieldValue, Color4f).SystemColorValue End If End If End If Catch ex As Exception ' 异常处理 End Try
关键提示
- 调用
GetValue(Of T)时,T要和字段存储的实际值类型匹配(比如DoubleField对应Double,Color4fField对应Color4f),而非字段类型本身。 - 用
TypeOf判断类型比直接比较GetType()更灵活,能兼容字段类型存在继承的场景。
内容的提问来源于stack exchange,提问作者andyopayne
相关产品推荐
相关产品推荐

