无法使用带有 Name.EndsWith 的反射在 C# 中找到接口
Posted
技术标签:
【中文标题】无法使用带有 Name.EndsWith 的反射在 C# 中找到接口【英文标题】:Unable to find Interface in C# using reflection with Name.EndsWith 【发布时间】:2016-11-24 09:27:36 【问题描述】:接口的名称是IService,但是当我试图在C#的反射中查找接口时,由于某种原因接口名称更改为,所以无法找到Iservice'1
请查看随附的 Ildasm 截图:
实际界面是这样的
public interface IService<TOutput>
where TOutput : class, new()
Task<List<TOutput>> GetAllAsync(dynamic inputParameter);
查找接口的代码: builder.RegisterAssemblyTypes(Assembly.Load(“服务”)) .Where(t => t.Name.EndsWith("服务"))
这里找不到 Service,因为 IService 有一些不同的名称,然后定义了一个。
知道为什么这个名字看起来像这样以及如何解决它吗?
【问题讨论】:
【参考方案1】:IService
是一个泛型。换句话说,它是IService<T>
。编译为 MSIL 时,C# 泛型的名称已被修改,如您所见。
您可以将服务设为非泛型,或使用.Contains
代替.EndsWith
。
【讨论】:
您在任何帖子中遇到过这个问题? 我没有手头的文档链接,但您可以通过反射轻松验证这一点。typeof(List<int>).Name == "List`1"
@Dreamweaver 你甚至可以在你的截图中看到名字是IService
1`。如果我没记错的话,这是编译器的一个技巧,它允许具有相同名称和不同数量的泛型参数的类。 Serge Lidins IL Assembler 书中概述了原因。以上是关于无法使用带有 Name.EndsWith 的反射在 C# 中找到接口的主要内容,如果未能解决你的问题,请参考以下文章