无法使用带有 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&lt;T&gt;。编译为 MSIL 时,C# 泛型的名称已被修改,如您所见。

您可以将服务设为非泛型,或使用.Contains 代替.EndsWith

【讨论】:

您在任何帖子中遇到过这个问题? 我没有手头的文档链接,但您可以通过反射轻松验证这一点。 typeof(List&lt;int&gt;).Name == "List`1" @Dreamweaver 你甚至可以在你的截图中看到名字是IService1`。如果我没记错的话,这是编译器的一个技巧,它允许具有相同名称和不同数量的泛型参数的类。 Serge Lidins IL Assembler 书中概述了原因。

以上是关于无法使用带有 Name.EndsWith 的反射在 C# 中找到接口的主要内容,如果未能解决你的问题,请参考以下文章

Linq学习日记-模糊查询

通过反射调用带有可选参数的方法

ajax提交文件

字典使用

字符串的方法使用

.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法