2014-11-22 4 views
0

У меня есть каталог, полный классов, и они в основном все выглядят следующим образом:Выполнить метод из динамически созданного экземпляра

class QEDestroy { 

    void showSettings() { 
     // Do Something Here 
    } 
} 

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

public class QESettings { 

    public void GetSettings() { 
     if (QEActions.actionInt >= 0) { 
      string action = QEActions.actions[QEActions.actionInt]; 
      // Generate the class based on the action. 
      // Run showSettings() within the class. 
     } 
    } 
} 

Я не могу понять, как создать экземпляр класса; например QEDestroy. Из того, что я прочитал это, как создается класс:

var myObj = Activator.CreateInstance("", "QE" + action); 

Если да, то как я бегу метод showSettings()?

+0

обычно все ваши классы наследуют от того же абстрактного класса с showSettings() определен метод, или все реализовать известный интерфейс с методом. Затем вы должны передать свой объект базовому классу или интерфейсу, а затем выполнить вызов. – dbugger

+0

Итак, я сделал это, теперь я получаю сообщение об ошибке «ArgumentException: assemblyString не может иметь нулевую длину» Я не уверен, что разместить там для скрипта Unity3 ... –

+0

Вы можете попробовать null вместо «", если это если эти классы находятся в исполняющей сборке. В противном случае требуется имя сборки. – dbugger

ответ

0

Простейшее решение часто является правильным. Создайте interface.

public interface QE 
{ 
    void showSettings(); 
} 

Тогда имеют различные «версии» QE, которые выполняют различные задачи на функции showSettings().

public class QE_Example 
{ 
    public void override showSettings() 
    { 
     print("I am different."); 
    } 
} 

Затем, когда вы экземпляр в вашем QESettings классе вы делаете это так:

public void GetSettings() 
{ 
    if(QEActions.actionInt >= 0) 
    { 
     ... 
     QE q = new QE_Example(); 
     q.showSettings(); 
    } 
} 

Это означает, что вы на самом деле наткнулся на хорошо известной под названием Design Pattern Strategy Pattern.

enter image description here

+0

Итак, как мне начать класс, где имя класса будет другим? Я мог бы сделать огромный 'if/else' или' switch', но это не похоже на хорошую Idea –

+0

Вам понадобятся инструкции if или событие, которое запускает тот момент, который будет использоваться. – FunctionR

Смежные вопросы