Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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-TypedConstant的类型。typeof表达式的值_C#_Roslyn_Typeof_Roslyn Code Analysis - Fatal编程技术网

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
表达式。看起来像个虫子。