FeildInfo.SetValue()无法正常工作。为什么!我可以解决这个问题吗?

时间:2019-05-14 21:39:38

标签: vb.net setvalue fieldinfo

因此,我正在制作一个函数,该函数将能够克隆我传递给它的任何类或自定义数据类型的克隆。

它像这样(sudo代码)

sub clone(ByRef newObj as Object, ByVal ogObj as Object)

   '-- create new instance of 'newObj' ----
   newObj = CTypeDynamic(Nothing, ogObj.GetType)


   '--- for all fields available in type  -----------------------
   '-------------------------------------------------------------
   for each fInfo as FieldInfo in ogObj.GetType().GetFields()

      dim myObj as Object = fInfo.GetValue(ogObj)   '<-- get value @ feild


      '--- if the field is standard system Type 
      '--- go ahead and set the new value
      if (myObj.GetType.Namespace="System") then

         fInfo.SetValue(newObj,myObj)   '<-- set new field value
         continue for
      end if 


      '--- if the field is an array
      '--- do some tricks with casting and run the 'clone'
      '--- routine for each index 
      '--- then set the newObj feild to the result
      if (myObj.GetType.IsArray) Then

          dim temp as object

          '*(do some tricks with casting 'myObj' and 'temp')

          for i as integer=0 to Ubound(myObj)

             clone(temp(i),myObj(i))
          next

          '*(cast 'temp' so it is of the same Type as the field attribute)

          fInfo.SetValue(newObj,temp)   '<-- set new field value

      end if


      '--- if the field is not a system standard
      '--- and/or has nested fields, 
      '--- run the clone routine to get all info
      dim newfInfo_arr = myObj.GetType().GetFields()
      If newfInfo_arr.Length > 0 And Not (IsNothing(newfInfo_arr)) Then

         dim temp as object

         '*(cast temp as new instance of Type 'myObj')

         clone(temp,myObj)

         fInfo.SetValue(newObj,temp)   '<-- set new field value

      end if


   next

end sub

我摆脱了所有关于转换和处理数组/对象转换的麻烦...

现在我遇到的问题是fieldInfo.SetValue()永远无法工作。 它不会引发任何错误,只是不会更新传递的对象。

我尝试过:

newObj = CType(newObj, Object)
fInfo.SetValue(newObj,myObj)

'-------------------------------------

newObj = CTypeDynamic(newObj , GetType(Object))
fInfo.SetValue(newObj,myObj)

'--------------------------------------

Dim newObj_ As Object = newObj
fInfo.SetValue(newObj_,myObj)


无论我做什么,我似乎都无法将'newObj'转换为对象。

此行一旦执行,从那时起,'newObj'始终为'ogObj'类型:

newObj = CTypeDynamic(Nothing, ogObj.GetType)

我想知道这是否与我通过引用传递“ newObj”有关。 必须解决这个问题,但是我不禁想到,如果不使用SetValue(),还有其他方法来设置任意字段。

GetValue()可以正常工作。

我已经读过几篇关于SetValue()的问题的文章,但是解决方案始终是一种解决方法,我不能将其用于此特定例程。

感谢帮助,

托尼。

0 个答案:

没有答案