ЭКЗЕМЛПЛЯР СТРУКТУРЫ НЕИЗВЕТНОГО ТИПА
У меня есть словарь в котором хранится ключ и тип нужной мне струткры.
УТОЧНЕНИЕ: в этом словаре обязательно находятся типы структур. Все они реазизуют один и тот же интерфейс(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(); Не работает
}
}
Я готов заменить интерфейсы на атрибуты или еще что то, лишь бы был способ который уменьшит количество упаковок..
Количество типов может изменяться, так как я пишу библиотеку.