我需要按顺序调用类对象。
首先应初始化Class1。
它将完成它的工作。
将返回一个值。
如果value为true,则将初始化Class2。否则,将不再初始化任何类。
这是我要实现的伪代码。
public function authenticated()
{
$userLastVisitedUrl = Auth::user()->last_visited_url;
if (!is_null($userLastVisitedUrl))
return redirect($userLastVisitedUrl);
return redirect($this->redirectTo);
}
有可能实现这样的目标吗?
答案 0 :(得分:0)
您有2个选择:
使List<Classes> myClassList
成为动态对象列表
List<dynamic> myClassList
,这样您可以添加其他类型的
此列表的类,并且可以轻松访问那里的操作(方法)
在运行时
上面的选项是比较容易上手的选项,但如果要考虑性能,设计,则不是最好的选择
似乎您的课程有一些共同点,他们都有
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();
}
}
注意:尽管我使用了接口,但您可以使用抽象类来完成相同的操作(但只有在类具有某些共同的行为时才应使用它,否则最好使用接口)。
就像其他人提到的那样,您可以使用反射来完成相同的事情,但是由于您已经说过很多类,因此这种方法的效果会更好,因为反射会非常昂贵:)