对编程相当陌生,我正在尝试制作一个ID系统,基本上是:
...
enum ids
{
id1,
id2,
id3
}
Dictionary<ids, _____> IdDictionary = new Dictionary<ids, _____>()
{
{0, Id1Class}
{1, Id2Class}
{2, Id3Class}
}
class Id1Class
{
//some data
}
class Id2Class
{
//some data
}
class Id3Class
{
//some data
}
...
这就是我想做的事。这个想法是,枚举包含 Id,字典分配数据类型(在本例中,我正在尝试创建省份系统,因此比如说德国的随机系统,枚举将分配 id,并使用 id,字典会将其设置为该省份,包括人口等信息)。我以为这会是一种方法,但似乎行不通。我不确定在声明字典值的类型的部分中要放什么。也许是命名空间之类的?或者让它成为一种方法什么的?不确定。
我想要
IdDictionary[ids.id1]
归还课程Id1Class
。
我不太确定我是否理解潜在的现实问题,但我有一种感觉,你试图以错误的方式解决它。
首先,为什么要返回类型本身?在我看来,每个省份都应该是一个 Province
类的
object,而不是一个单独的类。
其次,您尝试在两个值之间进行这种“匹配”尖叫多态性。由于您是初学者,我认为您不熟悉这些概念,因此我鼓励您阅读它们,因为它们是解决此类现实问题的基础。
但是为了回答你所质疑的问题,我将简单地使用
switch
声明:
Type IdToType(int id)
{
switch(id)
{
case 0:
return typeof(Id1Class);
case 1:
return typeof(Id1Class);
case 2:
return typeof(Id1Clas);
}
}
如果您确实想使用枚举,您可以将数字文字更改为枚举值(因为
enum
只是整数的包装):
enum Ids
{
Id1,
Id2,
Id3
}
Type IdToType(int id)
{
switch(id)
{
case Ids.Id1:
return typeof(Id1Class);
case Ids.Id2:
return typeof(Id1Class);
case Ids.Id3:
return typeof(Id1Class);
}
}
当然可以! 给你:
public static void Main()
{
Dictionary<ids, Type> IdDictionary = new Dictionary<ids, Type>()
{
{ids.id1, typeof(Id1Class)},
{ids.id2, typeof(Id2Class)},
{ids.id3, typeof(Id3Class)}
};
Console.WriteLine(IdDictionary[ids.id1]);
Console.WriteLine(IdDictionary[ids.id2]);
Console.WriteLine(IdDictionary[ids.id3]);
}
输出:
Program+Id1Class
Program+Id2Class
Program+Id3Class
说明:
您遇到的问题是您想使用类本身作为字典的值,不是这些类的单个实例/对象。 当您第一次接触词典时,可能还无法解释这一点。
为此,您需要将这些类视为单独的对象,而不是整体类型。 在 C# 中,类(以及其他事物,例如结构)本身就是
Type
的实例。 因此,要将类视为实例,您可以使用 typeof(<ClassName>)
,您将获得该类的对象表示。
所以在上面的例子中:
Type
。Dictionary
本身应该大写。typeof(Id1Class)
、typeof(Id2Class)
和typeof(Id3Class)
应该用于获取这些类的对象/实例表示。 通过这种方式,您可以像普通数据一样传递类,将它们用作函数的参数以及您想要的任何其他内容。 在这种情况下,您可以执行此操作来填充您的字典。ids.id1
和 ids.id2
之类的东西,而不是 0
和 1
之类的东西。 Sipo 通过将这一点纳入他们(已投票的)答案中来提醒我。这个旧线程的解决方案可能是......
public class Province : Form
{
public Dictionary<int, ProvinceDetails> GetProvinces()
{
Dictionary<int, ProvinceDetails> ProvinceResults = new Dictrionary<int, ProvinceDetails>();
ProvinceDetails details = new ProvinceDetails();
details.IdProvince = 45;
details.ProvinceName = "Nordrhein-Westfalen";
ProvinceResults.Add(1, details);
return ProvinceResults;
}
}
public class ProvinceDetails
{
public int IdProvince { get; set;}
public string ProvinceName { get; set;}
}
在循环中向字典中添加多个值时,还要检查该键是否不存在。