Roslyn - typeof 表达式的 TypedConstant.Value 类型
Roslyn - Type of TypedConstant.Value for a typeof expression
如果我有一些带有 typeof
表达式的源代码,例如,在属性中,我应该将 TypedConstant
的 Value
属性 转换成什么?我无法在任何地方找到记录的此信息。
比如我有如下源码:
class FooAttribute : Attribute
{
public FooAttribute(Type type) {}
}
[Foo(typeof(int))]
class Bar {}
我想在我的分析器中查看 Foo
的参数:
[DiagnosticAnalyzer(LanguageNames.CSharp)]
class MyAnalyser : DiagnosticAnalyzer
{
public override void Initialize(AnalysisContext context)
{
context.RegisterCompilationAction(LookAtFooArg);
}
private void LookAtFooArg(CompilationAnalysisContext context)
{
TypedConstant argumentTypedConstant = context.Compilation
.GetTypeByMetadataName("Bar")
.GetAttributes()
.Single()
.ConstructorArguments
.Single();
// Value here is typed as an object. What should I cast it to?
var typeOfExpressionValue = argumentTypedConstant.Value;
}
}
它将是 INamedTypeSymbol
。我通过老式的猜测了解到这一点。
var typeOfExpressionValue = (INamedTypeSymbol)argumentTypedConstant.Value;
如果我有一些带有 typeof
表达式的源代码,例如,在属性中,我应该将 TypedConstant
的 Value
属性 转换成什么?我无法在任何地方找到记录的此信息。
比如我有如下源码:
class FooAttribute : Attribute
{
public FooAttribute(Type type) {}
}
[Foo(typeof(int))]
class Bar {}
我想在我的分析器中查看 Foo
的参数:
[DiagnosticAnalyzer(LanguageNames.CSharp)]
class MyAnalyser : DiagnosticAnalyzer
{
public override void Initialize(AnalysisContext context)
{
context.RegisterCompilationAction(LookAtFooArg);
}
private void LookAtFooArg(CompilationAnalysisContext context)
{
TypedConstant argumentTypedConstant = context.Compilation
.GetTypeByMetadataName("Bar")
.GetAttributes()
.Single()
.ConstructorArguments
.Single();
// Value here is typed as an object. What should I cast it to?
var typeOfExpressionValue = argumentTypedConstant.Value;
}
}
它将是 INamedTypeSymbol
。我通过老式的猜测了解到这一点。
var typeOfExpressionValue = (INamedTypeSymbol)argumentTypedConstant.Value;