String.MemberwiseClone() method called through reflection doesn't work, why?

1.5k views Asked by At

Let me start by saying that I know it is a protected method and I'm not supposed to call it, but shouldn't it work since MemberwiseClone is defined in the Object class and String inherits from it?

So this is the cloning method (I removed null reference handling to focus on what's 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);
}

And if I call it like this:

string str = ShallowClone("My string");

The resulting string (str) will be:

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

Thanks in advance!

1

There are 1 answers

0
Joel Rondeau On BEST ANSWER

You are calling it and it is working. The problem is that String.MemberwiseClone is not doing what you are expecting it to do. It appears to create a string with the same length as the original string, but only copies over the first character.

I think the lesson to be learned here is: When you call a method you're not supposed to call, be very careful, learn what it does, and don't assume too much.