如何使用ReSharper SDK创建[CustomAttribute(typeof(GenericType<;,&

本文关键字:typeof GenericType lt CustomAttribute ReSharper 何使用 SDK 创建 | 更新日期: 2023-09-27 18:20:28

有没有办法用泛型类型的typeof表达式创建属性?

以下代码只能部分工作:

CSharpElementFactory factory = ...
IClassDeclaration typeDeclaration = ...
IClassDeclaration classDeclaration = ...
IType[] attributeTypeParameters = 
    (from typeParameter in classDeclaration.TypeParameters
    select (IType)TypeFactory.CreateUnknownType(module)).ToArray();
IType classType = TypeFactory.CreateType(classDeclaration.DeclaredElement, 
                                         attributeTypeParameters);
var attribute = factory.CreateAttribute(
    new SpecialAttributeInstance(
        ClrTypeNames.ContractClassAttribute,
        module,
        () => new[] { new AttributeValue(classType) },
        Enumerable.Empty<Pair<string, AttributeValue>>));
typeDeclaration.AddAttributeAfter(attribute, null);

如何使用ReSharper SDK创建[CustomAttribute(typeof(GenericType<;,&

我怀疑问题出在定义类声明的方式上。下面是一个代码片段,它用[ContractClass(typeof(Dictionary<,>))] 在上下文中装饰类

ClrTypeName contractClassAttribute = 
  new ClrTypeName("System.Diagnostics.Contracts.ContractClassAttribute");
ClrTypeName someGenericClass = new ClrTypeName("System.Collections.Generic.Dictionary`2");
var module = provider.PsiModule;
var owner = provider.GetSelectedElement<IClassDeclaration>(true, true);
var factory = CSharpElementFactory.GetInstance(module);
var someGenericTypeElement = TypeElementUtil.GetTypeElementByClrName(someGenericClass, module);
var unknownType = TypeFactory.CreateUnknownType(module);
var someGenericType = TypeFactory.CreateType(someGenericTypeElement, unknownType, unknownType);
var contractClassTypeElement = TypeElementUtil.GetTypeElementByClrName(contractClassAttribute, module);
var attribute = factory.CreateAttribute(contractClassTypeElement, new[] {new AttributeValue(someGenericType)},
                                        EmptyArray<Pair<string, AttributeValue>>.Instance);
owner.AddAttributeAfter(attribute, null);