2010-03-23 84 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 2010-03-23 00:12:48

+0

哈哈,不知何故我喜歡它 – soccerazy 2010-03-23 04:01:23

回答

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 2010-03-23 04:00:46

0

由於值類型按值傳遞,所以在對象的副本上調用SetValue

如果T是一個值類型,您可以簡單地編寫Return original,它將返回一個副本。
例如:

If GetType(T).IsValueType Then Return original