例如,我有以下类型:
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>();
}
如果您有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
中解析TypeSyntax
或TypeArgument
,但它在语法上,而不是语义上。
更新
请从哪个角度解释您希望获得有关运行时类型的信息。
正如我所写,如果您持有MyClass<T>
的语法树(在您的示例中),您将无法获得任何信息。罗斯林可以告诉你这是一种通用类型,但它。获取此信息的唯一方法是在运行时(例如,如果您处于调试模式,并在此类中的某处设置断点并检查监视窗口中的T类型)。
如果你想在你的例子中从var m = new MyClass<int>()
这样的实时语法中获取类型,那么我很容易回答。