C# Roslyn-TypedConstant的类型。typeof表达式的值
如果我有一些带有C# Roslyn-TypedConstant的类型。typeof表达式的值,c#,roslyn,typeof,roslyn-code-analysis,C#,Roslyn,Typeof,Roslyn Code Analysis,如果我有一些带有typeof表达式的源代码,例如,在属性中,我应该将TypedConstant的值属性强制转换为什么?我在任何地方都找不到记录的这些信息 例如,我有以下源代码: class FooAttribute : Attribute { public FooAttribute(Type type) {} } [Foo(typeof(int))] class Bar {} 我想看看分析器中的Foo的参数: [DiagnosticAnalyzer(LanguageNames.CSh
typeof
表达式的源代码,例如,在属性中,我应该将TypedConstant
的值
属性强制转换为什么?我在任何地方都找不到记录的这些信息
例如,我有以下源代码:
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;
研究此类问题的最佳方法是在VS中使用Roslyn的语法可视化工具。您可以右键单击节点,然后单击“获取常量值”。查看,它也可能是
ImmutableArray
,甚至您可能需要小心。@DavidG是的,它被键入为对象,因此它可能是任何对象。如果我写了[Foo(3)]
参数的值将是int
。在这个例子中,我碰巧知道Foo
的构造函数只接受类型
,所以它只能用类型的
表达式调用,所以(我认为)值
肯定是ITypeSymbol
@SLaks酷,我不知道语法可视化器存在。谢谢虽然,“查看常量值”似乎不适用于typeof
表达式。看起来像个虫子。