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