Как создать список неназначенных объектов класса - PullRequest
0 голосов
/ 08 июня 2019

Мне нужно вызывать объекты класса в порядке.

Class1 должен быть инициализирован первым.

Это сделает свою работу.

Значение будет возвращено.

Если значение истинно, Class2 будет инициализирован. В противном случае класс больше не будет инициализирован.

Вот код psuedo, чего я пытаюсь достичь.

List<Classes> myClassList = new List<Classes>();

myClassList.add(Class1);
myClassList.add(Class2);
//add more classes

foreach(Class currentClass in myClassList){
    initialize currentClass

    if(!currentClass.doSomething){
        break;
    }
    else
    {
        currentClass.dispose();
    }
}

Можно ли достичь чего-то подобного?

Ответы [ 3 ]

0 голосов
/ 08 июня 2019

Да, вы можете сохранить List из Type и добавить свои типы классов, например:

List<Type> types = new List<Type>();
types.Add(Class1.GetType());
types.Add(Class2.GetType());

Затем вы можете создать экземпляр класса данного Type, используя Activator илиотражение.

Пример:

foreach(var type in types){
  // creates an instance using the default constructor
  object instance = Activator.CreateInstance(type);

  //calls a given method
  MethodInfo method = type.GetMethod(methodName);
  method.Invoke(instance, null);
}

Создает экземпляр type с использованием конструктора по умолчанию и вызывает определенный метод.

0 голосов
/ 08 июня 2019

Вам нужно создать абстракцию (в этом случае мы будем использовать интерфейс), чтобы составить список классов, все классы должны реализовывать этот интерфейс.И тогда вы не будете делать список классов, а список этого интерфейса.

Я приведу простой пример:

    // The abstraction
    public interface IClass : IDisposable {
        bool DoSomething();
        void Initialize();
    }

    // First class
    public class Class1 : IClass {
        public void Dispose() {
            // Dispose stuff
        }

        public bool DoSomething() {
            //perform operations
            return true; // the result of your operations
        }

        public void Initialize() {
            // Do the initialization
        }
    }

    // Second class
    public class Class2 : IClass {
        public void Dispose() {
            // Dispose Stuff
        }

        public bool DoSomething() {
            //perform operations
            return true; // the result of your operations
        }

        public void Initialize() {
            // Do the initialization
        }
    }

    // Other classes ...
    // ...

    // Your method to perform the operations with a list of classes
    List<IClass> myClassList = new List<IClass>();

    myClassList.Add(new Class1());
    myClassList.Add(new Class2());
    //Adds more classes

    foreach (IClass currentClass in myClassList) {
        currentClass.Initialize();
        if (!currentClass.DoSomething()) {
            break;
        } else {
            currentClass.Dispose();
        }
    }

Примечание: Хотя я использовал интерфейс, вы могли бы сделать то же самое с помощью абстрактного класса (но выследует использовать его, только если классы имеют общее поведение, если нет, то лучше использовать интерфейс).

Как уже упоминалось, вы могли бы использовать отражение и выполнить то же самое, но так как вы сказали, что естьво многих классах этот подход будет работать лучше, потому что рефлексия будет намного дороже:)

0 голосов
/ 08 июня 2019

у вас есть 2 варианта:

  1. сделать List<Classes> myClassList список динамических объектов List<dynamic> myClassList, таким образом вы можете добавить другой тип классы к этому списку и могут легко получить доступ там операции (методы) во время выполнения

    вышеуказанный вариант - более простой вариант, но не лучший вариант, если вы хотите оценить производительность, дизайн

  2. кажется, что у ваших классов есть что-то общее, у них всех есть операция doSomething, так почему бы нам не сгруппировать эти типы в интерфейс (ICanDoSomething) или родительский класс в зависимости от ситуация, которая имеет метод doSomething, и ваш List<Classes> myClassList становится List<ICanDoSomething> myClassList

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...