我想要这样的类实例字典:
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
我怎么能这样做?
答案 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
。有三种方法可以做到这一点。
您知道实例的类型,并将实例转换为正确的类型。
ClassA myClassA = (ClassA)myInstance;
myClassA.MethodB(5);
您不知道实例的类型,但是您知道它有一个方法MethodB
,并且您使用的是.NET 4或更新版本。
dynamic myDynamicInstance = (dynamic)myInstance;
myInstance.MethodB(5);
当实例'类没有MethodB
时,您将获得例外。
使用反射。这有点复杂。如果您需要,可以四处搜索。我认为dynamic
是你在这里的方式。
答案 1 :(得分:2)
由于您正在讨论类实例,因此在不知道任何其他内容的情况下,您可以做的最好的事情是对象词典:
Dictionary<string, object> dict;
但是这根本不会有用,因为你想调用它们的方法。最好让你的状态实现某个接口,以便调用适当的方法:
Dictionary<string, IGameState> dict;
然后你可以像Virtlink在他的好答案中解释的那样填写这本词典。