C# 如何使用roslyn获取泛型类的运行时类型?

C# 如何使用roslyn获取泛型类的运行时类型?,c#,.net,roslyn,roslyn-code-analysis,C#,.net,Roslyn,Roslyn Code Analysis,例如,我有以下类型: public class MyClass<T> { public T Prop { get; } } 如果您有MyClass语法树,并且希望获得ITypeParameterSymbol T的具体类型或实例化类型,那么简单的答案是,您不能使用Roslyn 如果您指的是如何从实例化中获取类型,例如new MyClass(),那么答案是: var genericType = // the ObjectCreationExpressionSyntax from

例如,我有以下类型:

public class MyClass<T>
{
    public T Prop { get; }
}

如果您有
MyClass
语法树,并且希望获得
ITypeParameterSymbol T
的具体类型或实例化类型,那么简单的答案是,您不能使用Roslyn

如果您指的是如何从实例化中获取类型,例如
new MyClass()
,那么答案是:

var genericType = // the ObjectCreationExpressionSyntax from type GenericNameSyntax
var typArg = genericType.TypeArgumentList.Arguments.First();
var type = model.GetSymbolInfo(typeArg).Symbol // this is your concrete type
您还可以在
TypeArgument
中解析
IdentifierName
TypeSyntax
,但它是语法上的,而不是语义上的

更新

请解释您希望从哪个角度获取有关运行时类型的信息

正如我所写的,如果您持有
MyClass
的语法树(在您的示例中),则无法获得任何信息。Roslyn可以告诉你这是一个泛型类型,但它是。 获取此信息的唯一方法是在运行时(例如,如果您处于调试模式,并且在此类中的某个位置设置了断点,并在监视窗口中检查T的类型)


如果您想从实例化语法(如示例中的
var m=new MyClass()
)获取类型,正如我所回答的,这很容易。

@Alexander我相信OP是通过Rosyln询问的,而不是在运行时如果我运行它,它将显示为
with typeargumentlist
()-您是否在节点下查找了
类型参数列表
或类似文件?到目前为止,你对roslyn代码有什么看法?@MarcGravel Identifier(“T”)@isxaker你是在研究这个方法吗?还是在呼叫现场?(调用站点=
Main
);只有在呼叫站点上才可以执行此操作defined@MarcGravell是的,你说得对。它通过roslyn向我提供
令牌(SyntaxKind.ObjectKeyword)
我需要它。我做不到?证明在哪里?请参见@MarcGravel commentRoslyn是编译器,而不是运行时。您可以进行语法或语义(也可以是流)分析,但您不知道哪个是某个类,因为它可以是任何人。如果您想知道从何处创建混凝土类型,请确保可以。例如,如果您在VS中进行调试会话,您可以将T放在“监视”窗口中并查看具体类型,因为您有一个具体的T,但当您有通用的T时就不会了。@isxaker我希望我理解您试图实现的目标,否则,请尝试解释您的问题,我会提供帮助。谢谢。你说得对。我试着得到T的确切类型,所以分析我自己的代码。分析我的方法的所有调用链对我很有帮助。
static void Main(string[] args)
{
    // here I need to get int
    var m = new MyClass<int>();

    // here I need to get object
    var m1 = new MyClass<object>();
}
var genericType = // the ObjectCreationExpressionSyntax from type GenericNameSyntax
var typArg = genericType.TypeArgumentList.Arguments.First();
var type = model.GetSymbolInfo(typeArg).Symbol // this is your concrete type