【问题标题】:Roslyn - Type of TypedConstant.Value for a typeof expressionRoslyn - TypedConstant.Value 的类型,用于 typeof 表达式
【发布时间】:2017-07-19 16:43:02
【问题描述】:

如果我有一些带有typeof 表达式的源代码,例如,在一个属性中,我应该将TypedConstantValue 属性转换为什么?我在任何地方都找不到此信息。

例如,我有如下源码:

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;
    }
}

【问题讨论】:

    标签: c# roslyn typeof roslyn-code-analysis


    【解决方案1】:

    它将是INamedTypeSymbol。我通过良好的 ole-fashion 猜测了解到这一点。

    var typeOfExpressionValue = (INamedTypeSymbol)argumentTypedConstant.Value;
    

    【讨论】:

    • 调查此类问题的最佳方法是在 VS 中使用 Roslyn 的语法可视化工具。您可以右键单击一个节点,然后单击获取常量值。
    • 查看reference source,它也可能是ImmutableArray<TypedConstant> 甚至something else,所以您可能需要小心。
    • @DavidG 是的,它被输入为object,所以它可以是任何东西。如果我写了[Foo(3)],参数的Value 将是int。在这种情况下我碰巧知道Foo的构造函数只接受Type,所以它只能用typeof表达式调用,所以(我认为Value会绝对是ITypeSymbol
    • @SLaks 酷,我不知道 Syntax Visualiser 的存在。谢谢!
    • 虽然,“查看常量值”似乎不适用于typeof 表达式。看起来像一个错误。
    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多