2012-05-17 3 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"); 

Результирующая строка (ул) будет:

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

Заранее благодарен!

+0

Дикая догадка: основной нативный указатель, 'MemberwiseClone' принимает значение (т. Е. Первый символ) и длину, не копируя остальную часть. – Ryan

+1

В чем смысл клонирования строки? – spender

+0

Я клонировал элементы из коллекции и случайно нашел строку на этом пути ... –

ответ

2

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

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