C#中获取某个接口的所有子类的集合

本文介绍了一种方法,用于从指定的DLL文件中找出所有实现了特定接口的类。通过加载DLL并遍历所有类型,利用反射技术可以高效地识别出实现指定接口的具体类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日有朋友在论坛(.Net技术论坛)中问到,如何获取实现某个接口的所有类。这个问题是所有大型项目中经常遇到的问题,有经验的程序员可能会在开发的时候写好配置文档,以方便以后使用,而对于第三方开发的dll或程序则无此遍历了,那我们该怎么办呢?

这里我提供了一种基于msdn上对FindInterfaces的说明来解决这个问题。

思路如下:

首先载入一个类库文件,


//载入dll文件并获取属性
Assembly assembly = Assembly.LoadFile(dllFile); 
//取出所有类型集合
Type[] types = assembly.GetTypes();

接下遍历所有类型,为了找到,接口类型。再获取接口的实现类。


1: //遍历类型
2: foreach (Type type in types) 
3: { 
4: //找到接口
5: if (type.GetInterface("InterfaceName") != null && !type.IsAbstract) 
6: { 
7: // 这个type就是子类了。
8: type.GetConstructor(Type.EmptyTypes).Invoke(null); 
9: } 
10: }

至此,我们的问题得以解决。

以下是结合msdn得出一个实例:

 


using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 

namespace TestGetInterface 
class Program 
public static bool MyInterfaceFilter(Type typeObj, Object criteriaObj) 
if (typeObj.ToString() == criteriaObj.ToString()) 
return true
else
return false
static void Main(string[] args) 
Assembly assembly = Assembly.LoadFile(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll");//你的loadfile
Type[] types = assembly.GetTypes(); 
TypeFilter myFilter = new TypeFilter(MyInterfaceFilter); 
//String[] myInterfaceList = new String[2] 
// {"System.Collections.IEnumerable", 
// "System.Collections.ICollection"};
String[] myInterfaceList = new String[1] 
"System.Collections.ICollection"};//支持ICollection
foreach (Type type in types) 
for (int index = 0; index < myInterfaceList.Length; index++) 
Type[] myInterfaces = type.FindInterfaces(myFilter, 
myInterfaceList[index]); 
if (myInterfaces.Length > 0) 
Console.WriteLine("\n{0} implements the interface {1}.", 
type, myInterfaceList[index]); 
for (int j = 0; j < myInterfaces.Length; j++) 
Console.WriteLine("Interfaces supported: {0}.", 
myInterfaces[j].ToString()); 
//else
// Console.WriteLine(
// "\n{0} does not implement the interface {1}.",
// type, myInterfaceList[index]);
Console.ReadLine(); 


}

from:http://blog.sina.com.cn/s/blog_6f7b41640101bnyr.html


### C#子类继承的基础概念 在 C# 编程语言中,子类通过继承机制获取父类的特性与行为。这种设计模式允许开发者复用现有代码并扩展功能,从而提高开发效率和程序可维护性。 #### 一、基本原理 C# 的继承遵循单一继承原则,即一个类只能从另一个单一类派生[^3]。然而,这并不意味着无法实现多接口支持——尽管子类仅能直接继承自一个基类,但它可以间接实现多个接口[^1]。 #### 二、语法结构 以下是创建基类及其派生类的一个简单例子: ```csharp public class BaseClass { public void MethodInBase() { Console.WriteLine("This is a method from the base class."); } } public class DerivedClass : BaseClass { public void NewMethodInDerived() { Console.WriteLine("This is an additional method in the derived class."); } } ``` 在此示例中,`DerivedClass` 是 `BaseClass` 的派生类,它不仅包含了自身的独有方法 `NewMethodInDerived()`,还自动获得了来自其父类的方法 `MethodInBase()`。 #### 三、关于接口的支持 当某个基类已经实现了特定接口时,任何由此基类衍生出来的子类都会默认具备这些已实现的功能。这意味着无需再次显式地重新定义那些已经在祖先节点完成的工作项。 另外需要注意的是,在某些情况下可能希望阻止进一步的继承操作,则可以通过应用 `sealed` 关键字来达到此目的。 #### 四、优势分析 采用这样的方式构建应用程序组件有许多好处,其中包括但不限于简化复杂系统的管理流程以及增强模块间的互操作能力等方面[^4]。 ### 示例:结合接口与继承的实际运用场景 考虑如下情况下的具体编码实践: 假设存在这样一个需求—我们需要建立一系列能够执行某种运算逻辑的对象集合;为了满足这一目标,我们可以先定义好相应的契约形式(即所谓的“接口”),然后再让各个具体的业务实体分别遵照这份协议行事即可。 ```csharp public interface IOperation { double Execute(double input); } public abstract class OperationBase : IOperation { protected string Name; public virtual double Execute(double input){ return input * 2; // Default behavior. } public override string ToString(){ return $"[{Name}]"; } } public sealed class MultiplyByThree : OperationBase{ public MultiplyByThree(){ this.Name="Multiply By Three"; } public override double Execute(double input){ return input*3; } } ``` 上述片段展示了如何利用抽象类作为中介层连接起纯虚函数式的接口描述同最终实际表现形态之间的桥梁作用,并且特别强调了对于不可再被继续拓展的情况作出标记的重要性[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值