Удаление custom аттрибутов из макроса
От: KRT Украина  
Дата: 06.01.12 11:50
Оценка:
Привет.

Решил изучать потихоньку Nemerle. Возникло желание объявлять авто-свойства в виде
public property MyProperty : string;


Написал простенький макрос, вроде бы работает, но возникла проблема, когда нужно повесить аттрибут на свойство.
[NotMapped]
public property MyProperty : string;

естественно не работает, т.к. аттрибуту нужно свойство.
Можно ли удалить навешеные на поле аттрибуты и повесить их на сгенеренное мною свойство? Еще хотелось бы избавится от указания public (у меня все такие свойства публичные с публичными геттером и сеттером). Если можно — подскажите пожалуйста куда копать?

Привожу код макроса. Подозреваю что подход неверный, но уж как получилось

    [MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Field, Inherited = false)]
    macro property(typeBuilder : TypeBuilder, field : ClassMember.Field)
    syntax ("property") 
    {
        AutoPropertyMacroImpl.DoTransform(Macros.ImplicitCTX(), typeBuilder, field)
    }

    module AutoPropertyMacroImpl
    {
        public DoTransform(typer : Typer, typeBuilder : TypeBuilder, field : ClassMember.Field) : void
        {
            Macros.DefineCTX(typer);

            def newFieldName =  Macros.NewSymbol(field.ParsedName);

            field.Attributes = NemerleModifiers.Private | NemerleModifiers.CompilerMutable | NemerleModifiers.Mutable;
            field.name = Splicable.Name(newFieldName);

            _ = typeBuilder.Define(<[ decl: 
                        public $(field.ParsedName : usesite) : $(field.ParsedType)
                        {
                            [System.Runtime.CompilerServices.CompilerGenerated]
                            get { $(newFieldName.Id : usesite) }; 
                            [System.Runtime.CompilerServices.CompilerGenerated]
                            set { $(newFieldName.Id : usesite) = value };
                        }
                    ]>); 
        }
    }


P.S. При создании макроса с помощью визарда в VS2010 генерится неверный тип аргумента — ClassMembe.Field
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.