如何在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