Привет.
Решил изучать потихоньку 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