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

问题描述 投票:1回答:2

例如,我有以下类型:

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

或者说我有以下方法:

private static void Method<T>() 
{
     //how I can get a real type of <T>
}

如何使用roslyn获得运行时类型的泛型类?我的意思是真正的<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>();
}
c# .net roslyn roslyn-code-analysis
2个回答
0
投票

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

如果你的意思是如何从像new MyClass<int>()这样的实例化中获取类型,答案是:

var genericType = // the ObjectCreationExpressionSyntax from type GenericNameSyntax
var typArg = genericType.TypeArgumentList.Arguments.First();
var type = model.GetSymbolInfo(typeArg).Symbol // this is your concrete type

您也可以在IdentifierName中解析TypeSyntaxTypeArgument,但它在语法上,而不是语义上。

更新

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

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

如果你想在你的例子中从var m = new MyClass<int>()这样的实时语法中获取类型,那么我很容易回答。

© www.soinside.com 2019 - 2024. All rights reserved.