通过反射调用的String.MemberwiseClone()方法不起作用,为什么?

时间:2012-05-17 23:03:30

标签: c# reflection shallow-clone

首先我要说我知道它是一种受保护的方法而且我不应该调用它,但是它不应该起作用,因为在对象<中定义 MemberwiseClone / strong> class和 String 是从它继承的吗?

所以这是克隆方法(我删除了空引用处理以专注于重要的事情):

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"

提前致谢!

1 个答案:

答案 0 :(得分:2)

你正在呼唤它,它正在发挥作用。问题是String.MemberwiseClone没有做你期望它做的事情。它似乎创建一个与原始字符串长度相同的字符串,但只复制第一个字符。

我认为这里要学到的教训是:当你打电话给一个你不应该打电话的方法时,要非常小心,要知道它做了什么,不要假设太多。