gpt4 book ai didi

c# - 如何调用所有类中的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:01:55 25 4
gpt4 key购买 nike

现在我能给出的最简单的例子如下。

在 Unity3D 中有几种方法。 void Awake()void Start()

所以我要创建的是几个类,它们都包含方法 void Start() 并且我希望 void Main() 方法调用所有这些动态启动方法。我不想输入 Class test = new Class() 等。

如果有人能引导我朝着正确的方向前进,甚至给我一些示例代码,那就太好了。

最佳答案

因此您可以循环遍历每个类型并确定该类型是否有一个名为 Start 的方法以及您需要的确切签名。也许更好的方法是创建一个接口(interface)并让所有类都实现它。例如:

public interface IStartable
{
void Start();
}

public class SomeClass : IStartable
{
public void Start()
{
Console.WriteLine("Starting inside SomeClass");
}
}

现在您可以遍历所有加载的程序集并搜索 IStartable 的实现,例如:

var instances = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(t => t.IsClass && typeof(IStartable).IsAssignableFrom(t))
.Select(t => (IStartable)Activator.CreateInstance(t));

foreach (var instance in instances)
{
instance.Start();
}

这是假设所有这些类都有一个公共(public)的、无参数的构造函数。

这会起作用,但不是特别有效。如果您想将其放大一点,那么您可能需要查看其他选项,例如 Managed Extensibility Framework .

为了使它在更多情况下更通用和有用,这里将它包装在一个可以应用于任何类型的方法中:

public void RunOnAll<T>(Action<T> action) 
{
var instances = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(t => t.IsClass && typeof(T).IsAssignableFrom(t))
.Select(t => (T)Activator.CreateInstance(t));

foreach (var instance in instances)
{
action(instance);
}
}

所以现在你可以这样调用它:

RunOnAll<IStartable>(x => x.Start());

关于c# - 如何调用所有类中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45840356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com