Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Roslyn获取类定义的泛型属性类型的名称_C#_Roslyn - Fatal编程技术网

C# 使用Roslyn获取类定义的泛型属性类型的名称

C# 使用Roslyn获取类定义的泛型属性类型的名称,c#,roslyn,C#,Roslyn,我有一个定义如下的类: class Derived { public int t { get; set; } public List<Child> Childs { get; set; } } 其中节点是一个ClassDeclarationSyntax 此代码适用于属性t;返回属性类型的名称System.Int32。但是,对于属性Childs(它是一个带有泛型参数的类型),我得到了一个nulltypeSymbol,这不是该属性所期望的System.type 如何使用

我有一个定义如下的类:

class Derived
{
    public int t { get; set; }
    public List<Child> Childs { get; set; }
}
其中节点是一个
ClassDeclarationSyntax

此代码适用于属性
t
;返回属性类型的名称
System.Int32
。但是,对于属性
Childs
(它是一个带有泛型参数的类型),我得到了一个null
typeSymbol
,这不是该属性所期望的
System.type


如何使用Roslyn从类定义中获取泛型类型的属性类型?

您应该使用
SemanticModel.GetTypeInfo
而不是
SemanticModel.GetSymbolInfo
从节点检索相应的
ITypeSymbol

...
foreach (var property in properties) 
{
    var info = context.SemanticModel.GetTypeInfo(property);
    var typeSymbol = info.Type ?? info.ConvertedType; 
    ...
}
如果需要泛型的(第一)参数类型,可以使用:

TypeSyntax type=(property.type作为GenericNameSyntax.TypeArgumentList.Arguments[0];

您的
派生类
看起来不是很派生。是的,我只是简化了类定义。它是否是派生的对于这个问题来说并不重要。
System.Type
用于运行时类型;Roslyn在
INamedTypeSymbol
中有自己的类型系统。
context.SemanticModel.GetSymbolInfo(property.type).Symbol
的运行时类型是什么?我确信您需要尝试
SemanticModel.GetTypeInfo
而不是
SemanticModel.GetSymbolInfo
来检索
itTypeSymbol
...
foreach (var property in properties) 
{
    var info = context.SemanticModel.GetTypeInfo(property);
    var typeSymbol = info.Type ?? info.ConvertedType; 
    ...
}