【问题标题】:Generic type struct in dictionary字典中的通用类型结构
【发布时间】:2019-02-23 14:52:48
【问题描述】:

我想创建一个存储类类型属性的 C# 结构,以后可以实例化该属性。

我创建了这样的结构:

internal struct Command<T>
{
    internal string trigger;
    internal T clazz;
    internal string category;
}

然后我想将这些命令结构存储在字典中:

private Dictionary<string, Command> _commandMap;

如何定义 dict 以便为 Command 正确设置其值类型?还是我的整个方法都错了?

【问题讨论】:

  • 您是否尝试在字典中存储多种不同类型的命令,例如Command&lt;string&gt;Command&lt;int&gt;?如果是这样,你肯定会遇到问题。 (我也强烈建议保持字段私有,使用属性,以及使结构不可变。)
  • @JonSkeet 命令不应该是 int 或 string 这样的类型,而是类类型(例如 MyCustomCommandClass)。
  • 好吧,字符串也是一个类......听起来你可能想要对T 进行约束。但回到字典 - 你希望能够在同一个字典中存储 Command&lt;MyCustomCommandClass1&gt;Command&lt;MyCustomCommandClass2&gt; 吗?如果您能给我们提供更多背景信息,我们会更容易为您提供帮助。
  • @JonSkeet 是的,可以有不同的命令类,但它们都实现了某个接口,例如命令。对不起,缺乏上下文!在尝试从一些旧的 AS3 代码中移植它时,我仍在脑海中弄清楚整个逻辑)。
  • @JonSkeet 这可以通过协变通用接口来完成,例如ICommand&lt;out T&gt; where T: someKnownBaseType?不幸的是,我对这个主题还不够熟悉,但这听起来像是正确的用例。

标签: c# dictionary generics


【解决方案1】:

如果您希望您的字典是特定类型的:

private Dictionary<string, Command<my_type>> _commandMap;

如果您希望将所有内容都放在一个字典中,请不要为该类使用泛型。
您写道,您想存储一个类类型属性以便稍后实例化它。然而,在您的代码中,您存储的是类实例,而不是类类型。
我认为这就是您要寻找的:

internal struct Command
{
    internal string trigger;
    internal Type clazz;
    internal string category;
}

internal struct Command
{
    internal string trigger;
    internal IMyInterface clazz;
    internal string category;
}

最后:

private Dictionary<string, Command> _commandMap;

【讨论】:

  • 是的,我想Type 就是我要找的东西,谢谢!但是有一个问题……我以后如何实例化clazz?看来var c = new command.clazz() 不是它在 C# 中的工作方式。
  • 我认为这个问题可能需要澄清一下,但是,从上下文和 cmets 来看,我很确定 OP 想要在 Command&lt;T&gt; 结构中存储一个泛型类型 T 的实例。跨度>
  • @CoolBots 不,不是实例。我想存储实际的类类型,以便以后可以从中实例化新对象。
  • 对象实例 = Activator.CreateInstance(type);喜欢这里:stackoverflow.com/questions/11958825/…
猜你喜欢
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 2018-11-18
  • 1970-01-01
  • 2015-01-08
相关资源
最近更新 更多