Метод String.MemberwiseClone(), вызываемый через отражение, не работает, почему?

Позвольте мне начать с того, что я знаю, что это защищенный метод, и я не должен его вызывать, но разве он не должен работать, поскольку 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"

Заранее спасибо!

1 ответ

Вы называете это, и это работает. Проблема в том, что String.MemberwiseClone не делает то, что вы ожидаете. Похоже, что создается строка такой же длины, что и исходная строка, но копируется только по первому символу.

Я думаю, что урок, который нужно усвоить, заключается в следующем: когда вы вызываете метод, который вы не должны вызывать, будьте очень осторожны, изучайте, что он делает, и не принимайте слишком много.

Другие вопросы по тегам