你可以使用类作为字典中的值吗

问题描述 投票:0回答:3

对编程相当陌生,我正在尝试制作一个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

c# dictionary enums
3个回答
1
投票

我不太确定我是否理解潜在的现实问题,但我有一种感觉,你试图以错误的方式解决它。

首先,为什么要返回类型本身?在我看来,每个省份都应该是一个 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);
    }
}

0
投票

当然可以! 给你:

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>)
,您将获得该类的对象表示。

所以在上面的例子中:

  1. 字典的第二个通用参数应该是
    Type
  2. Dictionary
    本身应该大写。
  3. typeof(Id1Class)
    typeof(Id2Class)
    typeof(Id3Class)
    应该用于获取这些类的对象/实例表示。 通过这种方式,您可以像普通数据一样传递类,将它们用作函数的参数以及您想要的任何其他内容。 在这种情况下,您可以执行此操作来填充您的字典。
  4. 忘了提:也可以使用
    ids.id1
    ids.id2
    之类的东西,而不是
    0
    1
    之类的东西。 Sipo 通过将这一点纳入他们(已投票的)答案中来提醒我。

0
投票

这个旧线程的解决方案可能是......

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;}
}

在循环中向字典中添加多个值时,还要检查该键是否不存在。

© www.soinside.com 2019 - 2024. All rights reserved.