ОК, это противно ... опасность использования союза. Это может сработать, но это не очень хорошая идея - я думаю, я бы сравнил это с рефлексией (где вы можете делать большинство вещей). Мне было бы интересно посмотреть, работает ли это в среде с ограниченным доступом - если это так, это может представлять большую проблему ...
Я только что протестировал его без флага «Полное доверие», и среда выполнения отклоняет его:
Не удалось загрузить тип MemoryAccess
из сборки 'ConsoleApplication4,
Версия = 1.0.0.0, Культура = нейтральная,
PublicKeyToken = null ', потому что объекты
перекрываются со смещением 0 и
сборка должна быть проверяемой.
И чтобы иметь этот флаг, вам уже нужно высокое доверие - так что вы уже можете делать более неприятные вещи. Строки - это немного другой случай, потому что они не являются обычными объектами .NET - но есть и другие примеры способов их изменения - хотя подход «объединение» интересен. Для другого хакерского пути (с достаточным доверием):
string orig = "abc ", copy = orig;
typeof(string).GetMethod("AppendInPlace",
BindingFlags.NonPublic | BindingFlags.Instance,
null, new Type[] { typeof(string), typeof(int) }, null)
.Invoke(orig, new object[] { "def", 3 });
Console.WriteLine(copy); // note we didn't touch "copy", so we have
// mutated the same reference