gpt4 book ai didi

c# - 如何获取实现接口(interface)的类列表?

转载 作者:行者123 更新时间:2023-11-30 15:28:59 25 4
gpt4 key购买 nike

我正在尝试获取实现接口(interface)的类的列表,然后在程序的稍后时间点实例化这些类并将参数传递给它们的构造函数。

在之前的 Stack Overflow page ,我看到这段代码用一个空的构造函数实例化了类:

var preprocessors = from t
in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterfaces()
.Contains(typeof(Preprocessing))
&& t.GetConstructor(Type.EmptyTypes) != null
select Activator.CreateInstance(t) as Preprocessing;

但我不希望在不向构造函数传递某种参数的情况下实例化某些类(参数是在 for 循环中获得的,所以我必须等到实例化它)。

我尝试这样做以获得要实例化的类列表:

var preprocessors = from t
in Assembly.GetExecutingAssembly().GetTypes()
select t.GetInterfaces()
.Contains(typeof(Preprocessing))

但是在这样做之后,我不确定如何访问这些类并实例化它们。真的很感激这方面的一些指导。谢谢!!

编辑:我不知道要在 Activator.CreateInstance(...) 括号中放什么。我试着放这样的东西:

foreach (var sim in similarities)
{
var a = Activator.CreateInstance(sim, preprocessedData) as Preprocessing;

但这会引发错误,很可能是因为 preprocessedData 是一个 DenseMatrix 对象(来自 MathNet Numerics 库)。有什么方法可以发送 DenseMatrix 作为参数而不是数组?

最佳答案

带参数的 CreateInstance 重载在这里很合适

public static Object CreateInstance(
Type type,
params Object[] args
)

http://msdn.microsoft.com/en-US/library/wcxyzt4d(v=vs.110).aspx

使用示例

var constructorParams = new object[] { 1, "string", new object() }; //here is example of params that you will pass to each plugin constructor
var pluginTypes = Assembly.GetExecutingAssembly().GetTypes().Where(t => typeof(Preprocessing).IsAssignableFrom(t)); //all types of your plugin
var plugins = pluginTypes.Select(pluginType => Activator.CreateInstance(pluginType, constructorParams)); //instanciated plugins

更新

var a = Activator.CreateInstance(sim, new object[] { preprocessedData })

让我们想象一下 sim 有这个实现:

class sim
{
public sim(int a, string b, AnotherType c){}
}

因此,要使用参数构造函数启动此类,您必须传递三个参数,例如:

var a = Activator.CreateInstance(sim, new object[] { 1230, "string", new AnotherType() })

因此,通过反射的 CLR 将为您生成您的 intanse。

关于c# - 如何获取实现接口(interface)的类列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24562109/

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