2012-01-16 5 views
3

Есть ли способ создать атрибут с выражением typeof с общим типом?Как создать [CustomAttribute (typeof (GenericType <,>))] с помощью ReSharper SDK?

Следующий код работает только частично:

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

ответ

1

Я подозреваю, что проблема в том, каким образом вы определяете ваше объявление класса. Вот фрагмент кода, который украшает класс в контексте с [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); 
+0

'TypeElementUtil.GetTypeElementByClrName (someGenericClass, модуль)' является недействительным. Таким образом, 'TypeFactory.CreateType (someGenericTypeElement ...) генерирует исключение. –

+0

Какую версию .Net вы используете? (Я имею в виду, .NET framework для проекта.) –

+0

Целевая структура - это 4 (а не профиль клиента). –