【问题标题】:Dictionary of class instances [closed]类实例字典[关闭]
【发布时间】:2014-03-17 05:40:27
【问题描述】:

我想要一个这样的类实例字典:

Dictionary<string, class> dictionary = new Dictionary<string, class>();

// Load all classes of a namespace
Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "GameStates");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
    gameStateList.Add(typelist[i].Name, typelist[i]);
}

dictionary["ClassA"].MethodB(5); // Doesn't work

我该怎么做?

【问题讨论】:

  • 这是当前无效的代码 - class 是一个关键字。而且您根本没有创建任何实例。
  • 我知道,这是一个例子,因为我不知道该怎么做。
  • 好吧,如果您说的“不起作用”是在代码有效之前暗示代码 - 在这种情况下,它不是。
  • 请参阅 msmvps.com/blogs/jon_skeet/archive/2008/10/08/… 了解有关此的博客文章。
  • 你能提供更多关于你想要完成的信息吗?也许有更好、更简单的方法来达到同样的效果。

标签: c#


【解决方案1】:

请注意,C# 中有两种不同的东西。描述类的类规范包含在Type 对象中。描述特定对象的类实例object 或任何派生类。

您的代码还有一些其他问题,但我认为您可以在了解类型和实例的工作原理后自己解决这些问题。


在这种情况下,GetTypesInNamespace 返回Type 对象的列表,即类规范。如果需要,您可以将它们放入字典中。

Dictionary<string, Type> dictionary = new Dictionary<string, Type>();

然后,如果要将类规范变成实例,则必须调用类构造函数。为此,您可以在 Type 上使用反射。

// Get the type.
Type someType = dictionary["ClassA"];

// Create an instance.
object myInstance = Activator.CreateInstance(someType);

请注意,上面的示例适用于具有默认无参数构造函数的类。如果您的类有带参数的构造函数,请查看Activator.CreateInstance 方法的文档以了解如何传递这些参数。


现在您想在实例上调用MethodB。有三种方法可以做到这一点。

  1. 您知道实例的类型,并将实例转换为正确的类型。

    ClassA myClassA = (ClassA)myInstance;
    myClassA.MethodB(5);
    
  2. 您不知道实例的类型,但您知道它有一个方法 MethodB,并且您使用的是 .NET 4 或更高版本。

    dynamic myDynamicInstance = (dynamic)myInstance;
    myInstance.MethodB(5);
    

    当实例的类没有MethodB 时,你会得到一个异常。

  3. 使用反射。这有点复杂。如果需要,请四处寻找。我认为dynamic 是适合您的方式。

【讨论】:

    【解决方案2】:

    既然您在谈论类实例,那么在不了解其他任何内容的情况下您能做的最好的事情就是对象字典:

    Dictionary<string, object> dict;
    

    但这根本没有用,因为您想在它们上调用方法。最好让您的状态实现某个接口,以便您可以调用适当的方法:

    Dictionary<string, IGameState> dict;
    

    然后您可以像 Virtlink 在他的好答案中解释的那样填写这本字典。

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 2017-02-05
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多