【问题标题】:String.MemberwiseClone() method called through reflection doesn't work, why?通过反射调用的 String.MemberwiseClone() 方法不起作用,为什么?
【发布时间】:2012-05-17 23:03:29
【问题描述】:

首先让我说我知道它是一个受保护的方法,我不应该调用它,但它不应该工作,因为 MemberwiseClone 是在 Object 类和 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"

提前致谢!

【问题讨论】:

  • 猜测:底层原生是一个指针,MemberwiseClone 取值(即第一个字符)和长度而不复制其余部分。
  • 克隆字符串有什么意义?
  • 我正在从一个集合中克隆元素,偶然发现了一个字符串...

标签: c# reflection shallow-clone


【解决方案1】:

您正在调用它并且它正在工作。问题是String.MemberwiseClone 没有按照您的预期去做。它似乎创建了一个与原始字符串长度相同的字符串,但只复制第一个字符。

我认为这里要吸取的教训是:当你调用一个你不应该调用的方法时,要非常小心,了解它的作用,不要假设太多。

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多