2010-04-15 2 views
0

У меня есть много классов и вы хотите создать своего рода «каталог».Array/List/Directory of System.Type

Чтобы я мог создавать меню автоматически.

Щелчок по элементу меню затем создаст экземпляр класса и отобразит окно.

Что я хочу для этого массива System.Type, где я могу использовать все классы, не создавая их.

Хотя из моего теста и (неудачного) поиска в Google это не представляется возможным.

Любые идеи?

ответ

0

Это работает для вас, чтобы создать простое сопоставление? ArrayList не является общим, но вместо этого вы можете создать вместо него собственный объект.

var mapper = new System.Collections.Generic.Dictionary<string, System.Type>(); 
mapper.Add("show-about-box", typeof(MyApp.Forms.AboutBox)); 

Затем вы можете использовать refleciton, чтобы создать экземпляр класса, используя такой код:

// Create an instance using [Activator.CreateInstance][1]. 
System.Type toCreate = mapper["show-about-box"]; 
Object o = Activator.CreateInstance(toCreate); 

// Or, using try-get to be safer 
System.Type toCreate = null; 
if (mapper.TryGetValue("show-about-box", out toCreate)) { 
    Object o = Activator.CreateInstance(toCreate); 
} 
+0

Спасибо. Это действительно полезно и работает для меня. – Mike

0

Да, это может быть сделано, если я вас правильно понимаю. Посмотрите на классы в пространстве имен System.Reflection, начиная с класса Assembly и его метода GetExportedTypes. Это дает вам массив публично объявленных объектов System.Type из указанной сборки. http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getexportedtypes.aspx