Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在字典中存储类型或类型名,并在C#中的泛型方法中使用它吗?_C#_Dictionary_Struct_Types - Fatal编程技术网

我可以在字典中存储类型或类型名,并在C#中的泛型方法中使用它吗?

我可以在字典中存储类型或类型名,并在C#中的泛型方法中使用它吗?,c#,dictionary,struct,types,C#,Dictionary,Struct,Types,我尝试将字节数组解析为几个结构 我有一个内部带有StructureTypeID和StructureByteArray的UDP包 此外,我还有以下结构: //StructureTypeID==1 公共结构狗{} //StructureTypeID==2 公共结构类别{} //StructureTypeID==3 公共结构Rat{} 我有一个简单的通用方法: public static T ByteArray结构(byte[]ByteArray){ 我试过这样的方法: Dictionary St

我尝试将字节数组解析为几个结构

我有一个内部带有
StructureTypeID
StructureByteArray
的UDP包

此外,我还有以下结构:

//StructureTypeID==1
公共结构狗{}
//StructureTypeID==2
公共结构类别{}
//StructureTypeID==3
公共结构Rat{}
我有一个简单的通用方法:

public static T ByteArray结构(byte[]ByteArray){
我试过这样的方法:

Dictionary StructTypes=新字典(3)
{
{1,狗},
{2,Cat},
{3,老鼠},
};
StructTypes[StructureTypeID]ParsedStructure=ByteArrayStruct(StructureBytarray);

Dictionary StructTypes=新字典(3)
{
{1,“狗”},
{2,“猫”},
{3,“老鼠”},
};
类型StructType=Type.GetType(StructTypes[StructureTypeID]);
StructType ParsedStructure=ByteArrayStruct(StructureBytarray);
我还尝试在字典中存储泛型方法,但未能定义Func类型:

Dictionary ByteArrayParsers=新字典(3)
{
{1,ByteArrayToStruct},
{2,ByteArrayToStruct},
{3,ByteArrayToStruct},
};
var ParsedStructure=ByteArrayParsers[StructureTypeID](StructureByteArray);
它们都不起作用


如果..我可以使用简单的
。。当然可以,但我想也许有一种更优雅的方法可以做到这一点。

你可以使用
typeof
在字典中存储类型对象:

Dictionary<int, Type> StructTypes = new Dictionary<int, Type>(3)
{
  {1, typeof(Dog)},
  {2, typeof(Cat)},
  {3, typeof(Rat)},
};
Dictionary StructTypes=新字典(3)
{
{1,类型(狗)},
{2,typeof(Cat)},
{3,类型(鼠)},
};

但是你可以;t在泛型类型的增量中使用变量,因此
ByteArrayToStruct
将不起作用。您需要使用来获取泛型类型的实例。但是,请注意,编译器仍然不知道泛型类型是什么,因此不清楚这是否比大型switch语句更好。

想想你正在尝试做什么:你正在尝试基于运行时已知的值调用强类型方法;这是行不通的。你可能想创建一个名为animal的父类型,所有这些都是从中继承的——然后你可以用一个函数来处理它type@JohnathanBarclay我认为这是使用泛型的一个要点。在它调用一个之前,没有人知道它将使用什么类型。“现在我明白我错了。”霍根说,我也试过了。但我坚持使用
struct
类型(由于遗留代码),据我所知,它是不可继承的。我不理解你的问题,但无论如何,关于面向对象设计的每一篇文章或每一本书都以使用形状是动物为例——一定有一些例子你可以看?我几乎忘记了
开关
。但是,是的,我认为你是对的:没有必要重新发明轮子。非常感谢。我将继续使用
switch
语句。