MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Boxing экземпляра типа, определяемого во время run-time'а"
Answer 1158717
но я не знаю, на сколько данный метод безопасен
На столько же, насколько безопасен любой метод, пытающийся взломать внутренние структуры CLR - примерно ненасколько. Для частного случая, когда type является примитивным типом или состоит только из примитивных типов и имеет атрибут
StructLayout
со значением LayoutKind.Sequential или LayoutKind.Explicit, существует такое решение, основанное на документированных API:using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; class Program { [StructLayout(LayoutKind.Sequential)] struct S { public byte x; public byte y; public override string ToString() { return x.ToString() + ";" + y.ToString(); } } static object Box(ReadOnlySpan<byte> data, Type type) { var obj = Activator.CreateInstance(type); GCHandle gch = GCHandle.Alloc(obj, GCHandleType.Pinned); try { IntPtr p = gch.AddrOfPinnedObject(); Marshal.Copy(data.ToArray(), 0, p, data.Length); } finally { gch.Free(); } return obj; } static void Main(string[] args) { object x = Box(new byte[] { 1, 2 }, typeof(S)); Console.WriteLine(x); //Результат: 1;2 Console.ReadKey(); } }
В общем случае, насколько я знаю, нет, стабильного решения не существует.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.