2012-05-17 3 views
3

Permettez-moi de commencer par dire que je sais que c'est une méthode protégée et je ne suis pas censé l'appeler, mais il ne devrait pas travailler depuis MemberwiseClone est défini dans le objet classe et chaîne hérite de celui-ci ?La méthode String.MemberwiseClone() appelée par réflexion ne fonctionne pas, pourquoi?

C'est donc la méthode de clonage (j'ai supprimé le traitement de référence null se concentrer sur ce qui est important):

public static T ShallowClone<T>(T obj) 
{ 
    MethodInfo memberwiseClone; 
    memberwiseClone = obj.GetType().GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic); 
    return (T)memberwiseClone.Invoke(obj, null); 
} 

Et si je l'appelle comme ceci:

string str = ShallowClone("My string"); 

La chaîne résultante (str) sera:

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

Merci à l'avance!

+0

Wild guess: le natif sous-jacent est un pointeur, 'MemberwiseClone' prend la valeur (c'est-à-dire le premier caractère) et la longueur sans copier le reste. – Ryan

+1

Quel est le point de cloner une chaîne? – spender

+0

Je clonais des éléments d'une collection et je trouvais une chaîne le long du chemin ... –

Répondre

2

Vous l'appelez et cela fonctionne. Le problème est que ne fait pas ce que vous attendez de faire. Il semble créer une chaîne avec la même longueur que la chaîne d'origine, mais seulement des copies sur le premier caractère.

Je pense que la leçon à retenir ici est la suivante: Lorsque vous appelez une méthode que vous n'êtes pas censé appeler, soyez très prudent, apprenez ce qu'il fait et ne présumez pas trop.

Questions connexes