2010-03-23 3 views
2

.NET 값 유형의 필드를 복제하려고합니다. 리플렉션 (또는 동적으로 다른 것)을 사용하여 값 유형에 필드 값을 설정할 수 있습니까?.NET 리플렉션을 사용하여 값 유형에 필드 값을 설정할 수있는 방법

참조 유형에는 사용할 수 있지만 값 유형에는 사용할 수 없습니다. 나는 이유를 이해하지만 대안을 모른다. 값 유형 값으로 전달된다

shared function clone(of t)(original as t) as t 
    dim cloned as t 

    'if class then execute parameterless constructor 
    if getType(t).isClass then cloned = reflector.construct(of t)() 

    dim public_fields = original.getType.getFields() 

    for each field in public_fields 
    dim original_value = field.getValue(original) 
    'this won't work for value type, but it does work for reference type ??? 
    field.setValue(cloned, original_value) 
    next 

    return cloned 
end function 
+0

코드의 거의 모든 단어가 잘못 대문자로 표시됩니다. – SLaks

+0

하하하 고 어쨌든 나는 그것을 좋아한다 – soccerazy

답변

2

그 다음 당신이 신속하게 완료 값 형식 인 경우, 그냥 "원래"반환 : 당신은 더 많은 문제이 진정으로 보편적 인 유형을 만드는거야

'if class then execute parameterless constructor 
If GetType(t).IsClass Then 
    Dim types(-1) As Type 
    cloned = DirectCast(GetType(t).GetConstructor(types).Invoke(Nothing), t) 
Else 
    Return original 
End If 

예를 들어
매개 변수가없는 생성자가있을 필요는 없습니다. 예를 들어 문자열을보십시오.

+0

고마워, 나는 바보 야. – soccerazy

0

때문에 SetValue은 객체의 복사본을 호출하고있다.

T이 값 유형 인 경우 Return original을 쓰면 복사본이 반환됩니다.

If GetType(T).IsValueType Then Return original 
관련 문제