Могу ли я сохранить тип или имя типа в словаре и использовать его в общем методе c в C#? - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь разобрать массивы байтов в несколько структур.

У меня есть пакет UDP с StructureTypeID и StructureByteArray внутри.

Также у меня есть структуры:

//StructureTypeID == 1
public struct Dog{}
//StructureTypeID == 2
public struct Cat{}
//StructureTypeID == 3
public struct Rat{}

У меня есть простой метод generi c:

public static T ByteArrayToStruct<T>(byte[] ByteArray){}

Я пробовал что-то вроде этого:

Dictionary<int, Type> StructTypes = new Dictionary<int, Type>(3)
{
  {1, Dog},
  {2, Cat},
  {3, Rat},
};

StructTypes[StructureTypeID] ParsedStructure = ByteArrayToStruct<StructTypes[StructureTypeID]>(StructureByteArray); 

или

Dictionary<int, string> StructTypes = new Dictionary<int, string>(3)
{
  {1, "Dog"},
  {2, "Cat"},
  {3, "Rat"},
};

Type StructType = Type.GetType(StructTypes[StructureTypeID]);
StructType ParsedStructure = ByteArrayToStruct<StructType>(StructureByteArray);

Я также попытался сохранить метод generi c в словаре, но мне не удалось определить тип Fun c:

Dictionary<int, Func<byte[], SomethingHere>> ByteArrayParsers = new Dictionary<int, Func<byte[], SomethingHere>>(3)
{
  {1, ByteArrayToStruct<Dog>},
  {2, ByteArrayToStruct<Cat>},
  {3, ByteArrayToStruct<Rat>},
};

var ParsedStructure = ByteArrayParsers[StructureTypeID](StructureByteArray);

Ни один из них не работает.

Я могу использовать простые if .. else из Конечно, но я подумал, что, может быть, есть способ сделать это более элегантным способом.

1 Ответ

0 голосов
/ 19 марта 2020

Что ж, вы можете хранить объекты типа в словаре, используя typeof:

Dictionary<int, Type> StructTypes = new Dictionary<int, Type>(3)
{
  {1, typeof(Dog)},
  {2, typeof(Cat)},
  {3, typeof(Rat)},
};

Но вы не можете использовать переменные при делении типа c, поэтому ByteArrayToStruct<StructType> будет не работа. Вам нужно будет использовать Type.MakeGenericType, чтобы получить экземпляр типа generi c. Обратите внимание, однако, что компилятор по-прежнему не будет знать, что такое тип generi c, поэтому неясно, будет ли это лучше, чем большой оператор switch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...