c# - Roslyn 的 GetTypeByMetadataName() 和通用类型

标签 c# types roslyn

我正在尝试检索给定类型中的所有 IMethodSymbol。对于封闭类型(即没有泛型的类型)我可以使用 CSharpCompilation.GetTypeByMetaDataName()并传入完全限定的类型名称。

但是,对于开放类型(例如 MyClass<T> ),完全限定名称似乎不起作用。我试过提供不带类型参数 ( MyClass ) 的完全限定名称,也尝试提供封闭类型 ( MyClass<int> ),但似乎都不起作用。

使用完全限定名称查找此类型的最佳方法是什么?

最佳答案

正如评论中提到的,编译器约定是采用类似 MyClass<T> 的类名并将其表示为

MyClass`1

一个工作示例:

var tree = CSharpSyntaxTree.ParseText(@"
public class MyClass<T> {
    public static T Method()
    {
    }
}");

var mscorlib = new MetadataFileReference(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create("MyCompilation",
       syntaxTrees: new[] { tree }, references: new[] { mscorlib });

var type = compilation.GetTypeByMetadataName("MyClass`1");

关于c# - Roslyn 的 GetTypeByMetadataName() 和通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24157101/

相关文章:

c# - SignalR 中的简单注入(inject)器注册问题

c# - ASP MVC : Index action with optional string parameter

c# - 从 CLR 样式的类型全名获取 C# 样式的类型引用

c++ - Python 参数类型 C++ 签名

c# - Visual Studio 代码分析器 : Finding types with zero references

c# - 实现缺失接口(interface)的 Roslyn 2.x CodeFix,委托(delegate)给成员,VS 2017

c# - 使用 Roslyn 替换 C# 中的标识符

c# - 具有 Text 属性的多个按钮的一个 Click 事件

c# - 我应该在 C# 数据库调用周围放置 lock 语句吗?

c++ - 如何使 `std::is_empty_v<T> && sizeof(T) > 1` 为真的类型 T?