ЭКЗЕМЛПЛЯР СТРУКТУРЫ НЕИЗВЕТНОГО ТИПА

У меня есть словарь в котором хранится ключ и тип нужной мне струткры.

УТОЧНЕНИЕ: в этом словаре обязательно находятся типы структур. Все они реазизуют один и тот же интерфейс(IStruct, например).

Вызывая свой внутрений метод IStruct GetStructInstance(int key) я хочу получать экземпляр структуры, тип которой находится в словаре за переданым мною ключем. Такую проблему я пытался решить с классом Activator. Но при вызове метода Activator.CreateInstance() я оборачиваю его в (IStruct), что вызывает упаковки и, соответсвенно, алокации. Я хотел бы решить эту проблему без лишних упаковок. Решаема ли это проблема?

Пытался использовать Generic методы, но как говорит Rider, упаковки всё равно не уходят

public class Program
{
    static void Main(string[] args)
    {
        Manager.GetPacketInstance(13); //Пример Использования в коде
        MyStruct myStruct = Manager.GetPacketInstance<MyStruct>(); //Работает так как у знаю тип нужной мне структуры
    }
}


internal interface IStruct
{
    
}

internal struct MyStruct : IStruct { }

internal static class Manager
{
    private readonly static ConcurrentDictionary<int, Type> RegisteredPacketTypes = new ConcurrentDictionary<int, Type>();

    internal static void Register<T>(Action onSuccessful) where T : struct, IStruct {  }

    internal static void UnRegister<T>(Action onSuccessful) where T : struct, IStruct {  }

    internal static T GetPacketInstance<T>() where T : struct, IStruct //Работает нормально без лишних упаковок, так как я требую конкретный тип
    {
        return new T(); 
    }
   
    
    // ГЛАВНАЯ ПРОБЛЕМА 
    internal static IStruct GetPacketInstance(int typeId) //Из-за Активатора происходят упаковки
    {
        Type instanceType = RegisteredPacketTypes[typeId];

        return (IStruct)Activator.CreateInstance(instanceType)!; //УПАКОВКА

        //return new instanceType(); Не работает
    }
}

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

Количество типов может изменяться, так как я пишу библиотеку.


Ответы (0 шт):