检查来自程序集的类是否与接口中的所有方法相同
本文关键字:有方法 接口 是否 程序集 检查 | 更新日期: 2023-09-27 18:25:13
我有在运行时加载的自定义程序集。
此时,我有加载dll的代码,可以创建对象和execute方法的新实例。
我如何验证该类实现了我在接口中定义的所有函数。
(我正在尝试创建具有不同操作的插件系统,这些操作可以在运行时切换,以提供不同的行为)。
我的代码应该是这样的,这是主程序:
public Interface IArticleManager{
void SetMenuId(int MenuId);
void SetMenu(string name);
void SetContent(string content);
bool Save();
}
我的类库(断开连接,你可以从解决方案中看到)
public class XmlArticle{
public void SetMenuId(int MenuId){
//some implementation
}
public void SetMenu(string name){
//some implementation
}
public void SetContent(string content){
//some implementation
}
public bool Save(){
}
}
public class SqlArticle{
public void SetMenuId(int MenuId){
//some implementation
}
public void SetMenu(string name){
//some implementation
}
public void SetContent(string content){
//some implementation
}
public bool Save(){
}
}
基本上,要重新表述,您想检查一个类是否定义了接口的约定,即使它没有显式实现该接口?
这是一个非常不琐碎的想法,也是一个非常非常糟糕的想法。相反,我强烈建议您将插件接口重构为合约程序集,并从插件和主应用程序中引用该程序集。然后,您的插件可以实际实现契约,并且您可以获得编译器保护,避免混淆实现。
然而,如果你坚持走这条路:
var interfaceType = typeof(IArticleManager);
var targetType = typeof(SqlArticle);
foreach(var member in interfaceType.GetMembers())
{
var targetMember = targetType.GetMember(member.Name);
// compare the arguments, generic constraints, etc here
}
我将把它留给你来做比较,因为老实说,这是一个相当大的编码量。您需要检查成员是属性、事件或方法、泛型还是非泛型等。
您需要做的似乎是将接口移动到一个单独的程序集中,该程序集中只包含"主程序"和动态加载的DLL都可以访问的接口。
因此,为了创建一个动态加载的DLL并期望它在您的基础设施中工作,作者首先需要引用接口程序集,然后实现所提供的接口。
检查一个类是否实现了接口中的所有方法是没有用的,除非它实际上实现了接口本身——它具有相同的方法名称这一事实最终只是巧合。
要检查对象实例是否实现了接口,请执行以下操作:
if (obj is IArticleManager)
这将返回true。
然而,如果你想真正使用接口的方法,它会更好(更少的铸造):
IArticleManager manager = obj as IArticleManager;
if (manager != null)
{ do stuff }
当你不能在任何地方使用IArticleManager
时,它的用途是什么?
除此之外,如果我们接受你想要制作一个非常松散的插件系统,你可以强制每个插件程序集只有一个公共类,然后通过反射实例化该类,并通过反射调用它的方法,同时传递适当的参数。
与每个插件或其他外部代码一样,您应该验证输出并保护您的应用程序免受错误的影响(即捕获并记录插件异常)。这也将处理无效的插件(没有所需签名的插件)