如何创建未分配的类对象的列表

时间:2019-06-08 02:23:35

标签: c# list oop

我需要按顺序调用类对象。

首先应初始化Class1。

它将完成它的工作。

将返回一个值。

如果value为true,则将初始化Class2。否则,将不再初始化任何类。

这是我要实现的伪代码。

public function authenticated()
{
    $userLastVisitedUrl = Auth::user()->last_visited_url;
    if (!is_null($userLastVisitedUrl))
        return redirect($userLastVisitedUrl);
    return redirect($this->redirectTo);
}

有可能实现这样的目标吗?

3 个答案:

答案 0 :(得分:0)

您有2个选择:

  1. 使List<Classes> myClassList成为动态对象列表 List<dynamic> myClassList,这样您可以添加其他类型的 此列表的类,并且可以轻松访问那里的操作(方法) 在运行时

    上面的选项是比较容易上手的选项,但如果要考虑性能,设计,则不是最好的选择

  2. 似乎您的课程有一些共同点,他们都有 doSomething操作,所以为什么不将这些类型归为 接口(ICanDoSomething)或父类,具体取决于 doSomething方法的情况,以及您的 List<Classes> myClassList成为List<ICanDoSomething> myClassList

答案 1 :(得分:0)

是的,您可以存储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的实例并调用特定方法。

答案 2 :(得分:0)

您需要创建一个抽象(在这种情况下,我们将使用一个接口)以列出类,所有类都应实现此接口。然后,您将不要做一个Class列表,而是这个接口的列表。

我将为您提供一个简单的示例:

    // 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();
        }
    }

注意:尽管我使用了接口,但您可以使用抽象类来完成相同的操作(但只有在类具有某些共同的行为时才应使用它,否则最好使用接口)。

就像其他人提到的那样,您可以使用反射来完成相同的事情,但是由于您已经说过很多类,因此这种方法的效果会更好,因为反射会非常昂贵:)