2014-11-01 6 views
0

Я пытаюсь получить эту функцию:C# Создание экземпляра класса от типа

Class<?> c = Class.forName(dir.substring(6).replaceAll("/", ".") 
         + file.getName().replaceAll(".java", "")); 
Packet packet = (Packet)c.newInstance(); 

Для любого из вас, кто familliar с ним, приведенным выше кодом Java, он получает класс из каталог, а затем создает экземпляр этого, что то, что я пытаюсь сделать в C#

Я получил об этом далеко, и теперь я застрял ...

foreach(Type t in assembly.GetTypes()) 
    { 
     if (t.BaseType == typeof(Packet)) 
     { 

в основном я нужно найти способ построения класса из типа , затем создайте его экземпляр.

Я попытался с помощью Активатор, например, так:

foreach(Type t in assembly.GetTypes()) 
{ 
     if (t.BaseType == typeof(Packet)) 
     { 
      string namespaceName = t.Namespace; 
      string className = t.Name; 
      var myObj = Activator.CreateInstance(namespaceName, className); 

, но я не могу понять, как ссылаться на него как класс вместо ObjectHandle

ответ

4

В принципе мне нужно найти способ построения класса из типа, а затем создать его экземпляр.

Typeявляется класс (или структура, и т.д.). После того, как у вас есть подходящий Type, существуют различные варианты его создания ... например, Activator.CreateInstance() или вызовите Type.GetConstructors(), найдите нужный конструктор, а затем invoke.

Все эти подходы вернуться object, так что вам нужно бросить:

Packet packet = (Packet) Activator.CreateInstance(type); 
+0

СПАСИБО! Я использовал 'Activator.CreateInstance (namespaceName, className);' который должен был быть назначен ObjectHandle, и я ничего не мог с этим поделать. – Hobbyist

+0

@ Christian.tucker: Даже если бы вы могли использовать 'ObjectHandle',' Activator.CreateInstance' не принимает пространство имен и имя типа - оно принимает имя * assembly * и имя типа с именем пространства имен , –

1

Похоже, вы ищете Activator.CreateInstance метод

var instance = Activator.CreateInstance(type); 
Смежные вопросы