因此,我正在制作一个函数,该函数将能够克隆我传递给它的任何类或自定义数据类型的克隆。
它像这样(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()的问题的文章,但是解决方案始终是一种解决方法,我不能将其用于此特定例程。
感谢帮助,
托尼。