【问题标题】:How to create a data store with a dictionary of objects holding a generic field如何使用包含通用字段的对象字典创建数据存储
【发布时间】:2021-08-12 16:02:37
【问题描述】:

我目前正试图围绕 C# 的泛型展开思考,但我要么遗漏了一些信息,要么完全搞错了。我有一个名为 WatchedVariable 的类:

class WatchedVariable<T>
{
    private T Data { get; set; }

    public WatchedVariable(T initVal)
    {
        Data = initVal;
    }

    public T GetVal()
    {
        return Data;
    }
    public void SetData(T newVal)
    {
        Data = newVal;
    }
}

这个类的重点是保存一个可以是任何类型的值,因为我不知道运行时该类型是什么。

我还有一个 DataStore 用于保存这些 WatchedVariable 对象的字典:

class DataStore
{
    private Dictionary<string, WatchedVariable<T>> _store;

    public DataStore()
    {
        _store = new Dictionary<string, WatchedVariable>();
    }
    
    public void AddToStore(string varname, WatchedVariable variable)
    {
        _store.Add(varname, variable);
    }

    public string GetFromStore(string key)
    {
        return _store[key].GetVal();
    }

    public void ChangeValInStore(string key, string newVal)
    {
        _store[key].SetData(newVal);
    }
}

我的问题是如何设置 _store 字典,以便它可以获取这些通用 WatchedVariable 对象。目前编译器对我把 _store 字典值放在 WatchedVariable 旁边很生气。我想避免放置在 DataStore 类本身上,因为这实际上会将我锁定在一个特定的类型中,而我不想这样做。再说一次,要么我做错了,要么我在这里错过了一些东西。

【问题讨论】:

  • “避免放置”——放置什么?这个不清楚。
  • 与 DataStore 中一样。我可以看到我的措辞在那里令人困惑。
  • 我不知道运行时的类型是什么 - 这可能是它失败的地方 - 泛型不是运行时的东西。这是一种编写代码的方式,当您编写使用通用代码的其他代码时,编译器可以填充键入的缺失部分。微软写了List&lt;T&gt; 不知道你会在你的列表中添加什么类型的对象。你创建一个Person并创建一个List&lt;Person&gt;,编译器可以知道“哦,这个列表包含Person,这意味着public T GetThingAtIndex(int)方法应该返回一个Person。这不是将类型决策延迟到运行时的方法

标签: c# c#-4.0


【解决方案1】:

我不知道运行时的类型是什么。

这超出了泛型的能力。泛型专门用于允许您在保持编译时类型安全的同时放入任何类型。

协变和逆变(它模仿casting在泛型类型的同一类层次结构中)有一些余地,但保持编译时类型安全是它们存在的一个重要原因。

否则,我们将在任何地方都使用 List&lt;Object&gt; 的等价物并收工。

【讨论】:

  • 感谢您和 Caius 提供此信息。我对 C# 还很陌生,其中一些信息还没有根深蒂固。
  • @GlCo 没问题。 (编译时)类型安全在 .NET 中非常重要。真的很难摆脱。这确实是你一开始就不应该尝试摆脱的事情。 PHP 和 JS 的例子就是这样:sandraandwoo.com/2015/12/24/…
猜你喜欢
  • 2014-07-20
  • 2020-02-28
  • 2018-01-25
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
相关资源
最近更新 更多