类实例字典

时间:2014-02-17 19:10:03

标签: c#

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

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

我怎么能这样做?

2 个答案:

答案 0 :(得分:4)

请注意,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是你在这里的方式。

答案 1 :(得分:2)

由于您正在讨论类实例,因此在不知道任何其他内容的情况下,您可以做的最好的事情是对象词典:

Dictionary<string, object> dict;

但是这根本不会有用,因为你想调用它们的方法。最好让你的状态实现某个接口,以便调用适当的方法:

Dictionary<string, IGameState> dict;

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