gpt4 book ai didi

c# - 使用反射获取dll中某个基类型的所有类

转载 作者:IT王子 更新时间:2023-10-29 04:46:22 34 4
gpt4 key购买 nike

我有一个 dll,其中包含许多类,这些类都继承自 CommandBase 类。我试图在 C# 中使用反射获取所有这些类(CommandA、CommandB、CommandC 等)的实例,以便我可以对每个类调用特定的方法。这是我目前所拥有的:

//get assemblies in directory.
string folder = Path.Combine(HttpContext.Current.Server.MapPath("~/"), "bin");
var files = Directory.GetFiles(folder, "*.dll");
//load each assembly.
foreach (string file in files)
{
var assembly = Assembly.LoadFile(file);
if (assembly.FullName == "MyCommandProject")
{
foreach (var type in assembly.GetTypes())
{
if (!type.IsClass || type.IsNotPublic) continue;
if(type is CommandBase)
{
var command = Activator.CreateInstance(type) as CommandBase;
}
}
}
}

我有 2 个问题。第一个问题是“if(type is CommandBase”) 行给出以下警告:

给定的表达式绝不是提供的类型 CommandBase。

第二个问题是我无法弄清楚如何获取实际对象(CommandA、CommandB 等...)的实例,仅将其转换为 CommandBase 是不够的。

最佳答案

这是我使用的基于接口(interface)加载的方法。

private static List<T> GetInstances<T>()
{
return (from t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterfaces().Contains(typeof (T)) && t.GetConstructor(Type.EmptyTypes) != null
select (T) Activator.CreateInstance(t)).ToList();
}

这里是基于基类回调的相同函数。

private static IList<T> GetInstances<T>()
{
return (from t in Assembly.GetExecutingAssembly().GetTypes()
where t.BaseType == (typeof(T)) && t.GetConstructor(Type.EmptyTypes) != null
select (T)Activator.CreateInstance(t)).ToList();
}

当然需要稍微修改它以指向您正在加载的引用。

关于c# - 使用反射获取dll中某个基类型的所有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3353699/

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