如何在C#9代码生成器中获取ctor参数的类型?

如何在C#9代码生成器中获取ctor参数的类型?,c#,C#,我写了一堆代码如下 公共类MockableGenerator:ISourceGenerator { 私有常量字符串AttributeText=@” 名称空间系统 { [AttributeUsage(AttributeTargets.Class,Inherited=false,AllowMultiple=false)] 公共密封类MockableCodeGenAttribute:属性 { 公共MockableCodeGenAttribute(类型) { 类型=类型; } 内部字符串类{get;se

我写了一堆代码如下

公共类MockableGenerator:ISourceGenerator
{
私有常量字符串AttributeText=@”
名称空间系统
{
[AttributeUsage(AttributeTargets.Class,Inherited=false,AllowMultiple=false)]
公共密封类MockableCodeGenAttribute:属性
{
公共MockableCodeGenAttribute(类型)
{
类型=类型;
}
内部字符串类{get;set;}
内部字符串命名空间{get;set;}
内部类型{get;set;}
}
}"
;
public void Execute(GeneratorExecutionContext上下文)
{
AddSource(“MockableCodeGenAttribute”,SourceText.From(AttributeText,Encoding.UTF8));
如果(!(context.SyntaxReceiver是SyntaxReceiver))
返回;
CSharpParseOptions=(context.Compilation作为CSharpCompilation)。语法树[0]。选项作为CSharpParseOptions;
Compilation Compilation=context.Compilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(SourceText.From(AttributeText,Encoding.UTF8),options));
INamedTypeSymbol attributeSymbol=compilation.GetTypeByMetadataName(“System.MockableCodeGenAttribute”);
var namedTypeSymbols=新列表();
foreach(receiver.CandidateClass中的var cls)
{
SemanticModel model=compilation.GetSemanticModel(cls.SyntaxTree);
var clsSymbol=model.GetDeclaredSymbol(cls);
var attr=clsSymbol.GetAttributes().FirstOrDefault(ad=>ad.AttributeClass.Equals(attributeSymbol,SymbolEqualityComparer.Default));
...
然后使用如下所示的发电机

[MockableCodeGen(typeof(Dapper.DynamicParameters))]
公共静态类MySample{}
我想访问
MockableCodeGenAttribute
ctor参数的类型。我想在
Dapper.DynamicParameters
上使用反射

如何通过
attributeSymbol
attribute
变量访问
typeof(Dapper.DynamicParameters)
内部
Execute()

编辑


attr?.ConstructorArguments[0]。Value
是一个
对象?
并强制转换到
系统。Type
不起作用。我需要
typeof(Dapper.DynamicParameters)
的确切结果最终结果是:

var type = (INamedTypeSymbol)attributeData.ConstructorArguments[0].Value;
然后,要扫描程序集中该类型所在的所有类型,请使用
SymbolVisitor

type.ContainingAssembly.GlobalNamespace
最终结果是:

var type = (INamedTypeSymbol)attributeData.ConstructorArguments[0].Value;
然后,要扫描程序集中该类型所在的所有类型,请使用
SymbolVisitor

type.ContainingAssembly.GlobalNamespace

您已经获得了
属性数据
,因此只需查看
.ConstructorArguments
?我无法从中获取实际类型。它具有一些属性,如种类、类型、值。如何获取typeof(Dapper.DynamicParameters)的实际结果?您不会得到
类型
对象,因为这是一个在编译时不可用的运行时概念。
.Value
将是一个符号,表示
类型(…)
expressionattr?.ConstructorArguments[0]。Value是一个对象?但我想要确切的类型(Dapper.DynamicParameters)。我想反思一下它的程序集。看看attr.ConstructorArguments[0]的实际运行时类型。Value你已经得到了
属性数据,所以只要看看
。ConstructorArguments
?我无法从那里得到实际类型。它有一些属性,如种类、类型、值。如何获得typeof的实际结果(Dapper.DynamicParameters)?您不会得到一个
类型的
对象,因为这是一个在编译时不可用的运行时概念。
.Value
将是一个符号,表示
类型(…)
expressionattr?.ConstructorArguments[0]。Value是一个对象?但我想要确切的类型(Dapper.DynamicParameters)。我想对其程序集进行反思。请查看attr.ConstructorArguments[0]的实际运行时类型。Value