在 Roslyn 中解析参数类型
Resolving parameter type in Roslyn
我正在使用 Roslyn 来实施自定义业务规则。目前,我有点卡住了,我必须在调用方法时验证参数的类型。验证正在调用该方法或包含参数的方法没有问题。
我通过使用 GetSymbolInfo 获取当前语法的符号来解析 IdentifierNameSyntax。它不为空,并且包含我正在寻找的信息,例如:
CandidateReason: None
CandidateSymbols: Length = 0
Symbol: Local System.Threading.Tasks.TaskScheduler ui
进入Symbol属性的时候,想验证ui这个变量确实是一个TaskScheduler,但是运行了几天一直不成功。。基本上,这里是我在 Symbol
时得到的信息
Local System.Threading.Tasks.TaskScheduler ui
CanBeReferencedByName: true
ConstantValue: null
ContainingAssembly: Assembly TestProject, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
ContainingNamespace: Namespace ConsoleApplication1
ContainingSymbol: Method void ConsoleApplication1.TypeName.Test()
ContainingType: NamedType ConsoleApplication1.TypeName
DeclaredAccessibility: NotApplicable
DeclaringSyntaxReferences: Length = 1
HasConstantValue: false
HasUnsupportedMetadata: false
HighestPriorityUseSiteError: 2147483647
IsAbstract: false
IsCatch: false
IsConst: false
IsDefinition: true
IsExtern: false
IsFixed: false
IsFor: false
IsForEach: false
IsImplicitlyDeclared: false
IsOverride: false
IsSealed: false
IsStatic: false
IsUsing: false
IsVar: true
IsVirtual: false
Kind: Local
Language: "C#"
Locations: Length = 1
MetadataName: "ui"
Name: "ui"
OriginalDefinition: Local System.Threading.Tasks.TaskScheduler ui
OriginalSymbolDefinition: Local System.Threading.Tasks.TaskScheduler ui
Type: NamedType System.Threading.Tasks.TaskScheduler
binder: {Microsoft.CodeAnalysis.CSharp.BlockBinder}
这是我到目前为止获得 ui 类型的内容:
- 原始定义上的 ToString()
- 原始定义上的 ToDisplayString()
- 符号上的 ToString()
- 试图达到类型,但我只能在运行时看到它....
如果需要,我可以提供示例代码,但我无法分享我所做的代码。
对于那些可能想知道的人,控制台应用程序是在 TDD 下模拟的,我们有自己的工具来创建单元测试。但它对这种特殊情况没有任何影响。
感谢您的帮助,我真的很感激!
您需要将 ISymbol
转换为 ILocalSymbol
,即 public。
然后您可以使用 Type
属性.
我正在使用 Roslyn 来实施自定义业务规则。目前,我有点卡住了,我必须在调用方法时验证参数的类型。验证正在调用该方法或包含参数的方法没有问题。 我通过使用 GetSymbolInfo 获取当前语法的符号来解析 IdentifierNameSyntax。它不为空,并且包含我正在寻找的信息,例如:
CandidateReason: None
CandidateSymbols: Length = 0
Symbol: Local System.Threading.Tasks.TaskScheduler ui
进入Symbol属性的时候,想验证ui这个变量确实是一个TaskScheduler,但是运行了几天一直不成功。。基本上,这里是我在 Symbol
时得到的信息Local System.Threading.Tasks.TaskScheduler ui
CanBeReferencedByName: true
ConstantValue: null
ContainingAssembly: Assembly TestProject, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
ContainingNamespace: Namespace ConsoleApplication1
ContainingSymbol: Method void ConsoleApplication1.TypeName.Test()
ContainingType: NamedType ConsoleApplication1.TypeName
DeclaredAccessibility: NotApplicable
DeclaringSyntaxReferences: Length = 1
HasConstantValue: false
HasUnsupportedMetadata: false
HighestPriorityUseSiteError: 2147483647
IsAbstract: false
IsCatch: false
IsConst: false
IsDefinition: true
IsExtern: false
IsFixed: false
IsFor: false
IsForEach: false
IsImplicitlyDeclared: false
IsOverride: false
IsSealed: false
IsStatic: false
IsUsing: false
IsVar: true
IsVirtual: false
Kind: Local
Language: "C#"
Locations: Length = 1
MetadataName: "ui"
Name: "ui"
OriginalDefinition: Local System.Threading.Tasks.TaskScheduler ui
OriginalSymbolDefinition: Local System.Threading.Tasks.TaskScheduler ui
Type: NamedType System.Threading.Tasks.TaskScheduler
binder: {Microsoft.CodeAnalysis.CSharp.BlockBinder}
这是我到目前为止获得 ui 类型的内容:
- 原始定义上的 ToString()
- 原始定义上的 ToDisplayString()
- 符号上的 ToString()
- 试图达到类型,但我只能在运行时看到它....
如果需要,我可以提供示例代码,但我无法分享我所做的代码。 对于那些可能想知道的人,控制台应用程序是在 TDD 下模拟的,我们有自己的工具来创建单元测试。但它对这种特殊情况没有任何影响。 感谢您的帮助,我真的很感激!
您需要将 ISymbol
转换为 ILocalSymbol
,即 public。
然后您可以使用 Type
属性.