Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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#_Generics_Dictionary - Fatal编程技术网

C# 使用泛型的词典

C# 使用泛型的词典,c#,generics,dictionary,C#,Generics,Dictionary,我目前正在为我的游戏编写一个资源管理器。这基本上是一个类,它将处理不同类型的所有其他对象,每个对象都通过名称(System.String)引用。现在这是我当前的实现,但是因为我使用的是对象字典,所以我仍然需要强制转换每个对象。在这种情况下有没有使用泛型的方法?我对这些不太了解,我试着读了一遍,结果让我更加困惑 public static class ResourceManager { public static Dictionary<string, object> Resou

我目前正在为我的游戏编写一个资源管理器。这基本上是一个类,它将处理不同类型的所有其他对象,每个对象都通过名称(System.String)引用。现在这是我当前的实现,但是因为我使用的是对象字典,所以我仍然需要强制转换每个对象。在这种情况下有没有使用泛型的方法?我对这些不太了解,我试着读了一遍,结果让我更加困惑

public static class ResourceManager
{
    public static Dictionary<string, object> Resources { get; private set; }

    public static void LoadResources()
    {
        Resources = new Dictionary<string, object>();

        //Sample resource loading code
        Resources.Add("number", 3);
        Resources.Add("string", "bleh");

        Console.Log("Loaded " + Resources.Count + " resources.");
    }
}
公共静态类资源管理器
{
公共静态词典资源{get;private set;}
公共静态void LoadResources()
{
资源=新字典();
//示例资源加载代码
资源。添加(“编号”,3);
添加(“字符串”、“bleh”);
Log(“已加载”+资源。计数+“资源”);
}
}

我想这些对象都至少有一些共同点。找到共同点,并将其转化为对象实现的接口。然后使用
词典

是否只需要一组资源,或者每种类型的资源都可以有一组

public class ResourceMap<T> extends Dictionary<string, T> { }

public static class ResourceManager
{
    public static ResourceMap<Font> Fonts { get; private set; }
    public static ResourceMap<Image> Images { get; private set; }
    public static ResourceMap<Sound> Sounds { get; private set; }

    public static void LoadResources()
    {
        Fonts = new ResourceMap<Font>();
        Images = new ResourceMap<Image>();
        Sounds = new ResourceMap<Sound>();

        Fonts.Add("Helvetica", new Font("Helvetica", 12, FontStyle.Regular));
        Images.Add("Example", Image.FromFile("example.png"));
    }
}
公共类ResourceMap扩展字典{}
公共静态类资源管理器
{
公共静态资源映射字体{get;private set;}
公共静态资源映射映像{get;private set;}
公共静态资源映射声音{get;private set;}
公共静态void LoadResources()
{
字体=新资源映射();
Images=newresourcemap();
声音=新资源地图();
添加(“Helvetica”,新字体(“Helvetica”,12,FontStyle.Regular”);
Image.Add(“Example”,Image.FromFile(“Example.png”);
}
}

资源是否有一个通用接口?与问题无关,但仅供参考,“资源”只有一个“s”。事实上,法语是我的母语,法语需要两个。总是让我生气。就像地址一样,法语中只有一个“d”。谢谢你指出这一点;)事实上,这些完全没有共同之处。对象是字体、图像和声音。我仍然需要使用接口来强制转换它们,因为我有只使用这些对象的外部方法。在这种情况下,您希望构建一些使用重载函数的东西,这些重载函数将根据函数调用的类型解析来工作。但这不仍然需要取消装箱,因为我仍然将它们存储为对象吗?仅值类型。在这种情况下,我怀疑其中大多数都是原语,你真的应该很少构建自己的结构——C#在类方面做得更好。在这种情况下,我真的不需要泛型。我们的想法是只有一个资源列表,并使用泛型来避免类型转换,但我想我在这里把东西弄糊涂了。好吧,您可以完全避免
ResourceMap
类,只使用
Dictionary
——也许这样更容易阅读。问题是,您是否需要能够在不知道资源类型的情况下获取资源?我个人无法想象这样的场景。不,我想做的是只使用一个属性/方法访问资源,即使这些资源可以是不同类型的。在这种情况下,您需要在某个时候强制转换。方法只能返回特定类型的值:如果要返回不同类型的对象,则需要使用它们的公共超类,这意味着您需要在将对象用于其预期用途时向下转换。