例如,我有以下类型:
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>();
}
答案 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
中解析TypeSyntax
或TypeArgument
,但是从语法上而不是从语义上来说。
更新
请从哪个角度解释您要获取有关运行时类型的信息。
如我所写,如果您拥有MyClass<T>
的语法树(在您的示例中),您将无法获得任何信息。 Roslyn可以告诉您这是一个泛型类型,但是它却是。
获取此信息的唯一方法是在运行时(例如,如果您处于调试模式,并且在此类的某个位置设置了断点并在监视窗口中检查T的类型)。
如果您想从示例中的var m = new MyClass<int>()
之类的实例化语法中获取类型,请按我的回答就很容易。