c# -从程序集中的文件夹中获取所有接口
本文关键字:获取 接口 文件夹 程序 程序集 集中 | 更新日期: 2023-09-27 17:49:53
我有一些WCF服务,我在某个文件夹内的程序集中有一个服务契约(接口)列表。我知道命名空间,它看起来像这样:
MyProject.Lib.ServiceContracts
我希望有一种方法可以抓取该文件夹中的所有文件,这样我就可以遍历每个文件并获取每个方法的属性。
以上是可能的吗?如果有,有什么建议吗?
感谢您的帮助。
这应该可以得到所有这样的接口:
string directory = "/";
foreach (string file in Directory.GetFiles(directory,"*.dll"))
{
Assembly assembly = Assembly.LoadFile(file);
foreach (Type ti in assembly.GetTypes().Where(x=>x.IsInterface))
{
if(ti.GetCustomAttributes(true).OfType<ServiceContractAttribute>().Any())
{
// ....
}
}
}
@Aliostad的答案已经发布了,但我将添加我的答案,因为我认为它更彻底…
// add usings:
// using System.IO;
// using System.Reflection;
public Dictionary<string,string> FindInterfacesInDirectory(string directory)
{
//is directory real?
if(!Directory.Exists(directory))
{
//exit if not...
throw new DirectoryNotFoundException(directory);
}
// set up collection to hold file name and interface name
Dictionary<string, string> returnValue = new Dictionary<string, string>();
// drill into each file in the directory and extract the interfaces
DirectoryInfo directoryInfo = new DirectoryInfo(directory);
foreach (FileInfo fileInfo in directoryInfo.GetFiles() )
{
foreach (Type type in Assembly.LoadFile(fileInfo.FullName).GetTypes())
{
if (type.IsInterface)
{
returnValue.Add(fileInfo.Name, type.Name);
}
}
}
return returnValue;
}
以上答案可能不适用于用c++/CLI创建的程序集(即具有托管/非托管代码的程序集)。
我建议替换这一行:
foreach (Type ti in assembly.GetTypes().Where(x=>x.IsInterface))
foreach (Type ti in assembly.GetExportedTypes().Where(x=>x.IsInterface))