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

时间:2019-02-13 10:37:01

标签: c# .net roslyn roslyn-code-analysis

例如,我有以下类型:

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>();
}

2 个答案:

答案 0 :(得分:0)

Type type = typeof(T);

您可以通过这种方式输入文字。

答案 1 :(得分: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>的语法树(在您的示例中),您将无法获得任何信息。 Roslyn可以告诉您这是一个泛型类型,但是它却是。 获取此信息的唯一方法是在运行时(例如,如果您处于调试模式,并且在此类的某个位置设置了断点并在监视窗口中检查T的类型)。

如果您想从示例中的var m = new MyClass<int>()之类的实例化语法中获取类型,请按我的回答就很容易。