2012-05-17 40 views
3

讓我說,我知道這是一個受保護的方法,我不應該把它啓動,但它不應該工作,因爲MemberwiseClone對象字符串從它定義繼承?通過反射調用的String.MemberwiseClone()方法不起作用,爲什麼?

因此,這是克隆方法(我刪除空引用處理專注於什麼是重要的):

public static T ShallowClone<T>(T obj) 
{ 
    MethodInfo memberwiseClone; 
    memberwiseClone = obj.GetType().GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic); 
    return (T)memberwiseClone.Invoke(obj, null); 
} 

如果我這樣稱呼它:

string str = ShallowClone("My string"); 

結果字符串(STR )將是:

"M\0\0\0\0\0\0\0\0" 

在此先感謝!

+0

瘋狂猜測:底層native是一個指針,「MemberwiseClone」採用值(即第一個字符)和長度,而不復制其餘部分。 – Ryan

+1

克隆一個字符串有什麼意義? – spender

+0

我是從一個集合中克隆元素,碰巧找到一個字符串... –

回答

2

你打電話給它,它正在工作。問題是沒有做你期望的事情。它似乎創建了一個與原始字符串長度相同的字符串,但只複製第一個字符。

我認爲這裏學到的教訓是:當你調用一個方法時,你不應該打電話,要非常小心,瞭解它做了什麼,並且不要假設太多。

相關問題