От: | VladD2 | www.nemerle.org | |
Дата: | 04.04.10 17:23 | ||
Оценка: | |||
#Имя: | FAQ.nemerle.GetCustomAttributeInfo001 |
using Nemerle;
using Nemerle.Collections;
using Nemerle.Compiler;
using Nemerle.Text;
using Nemerle.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
namespace GetInfoFromCustomAttributeMacro
{
[Nemerle.MacroUsage (MacroPhase.WithTypedMembers, MacroTargets.Field, Inherited = true, AllowMultiple = false)]
public macro TestMacro(tb : TypeBuilder, fld : FieldBuilder)
{
Helper.DoWork(Nemerle.Macros.ImplicitCTX(), tb, fld)
}
module Helper
{
public DoWork(typer : Typer, _tb : TypeBuilder, fld : FieldBuilder) : void
{
def attrs = fld.GetModifiers().GetCustomAttributes();
//assert2(false); // если раскоментарить, то можно будет поглядеть на работу макроса под отладчиком!
foreach (a in attrs)
{
| <[ $attr($(str : string)) ]> => // Распознаем атрибут которому передан один не именованный параметр типа string.
def typedAttr = typer.BindFixedType(attr); // пытаемся связать "имя макроса" с имеющимися на время компиляции типами.
// Теперь мы можем сверять полное имя типа. Если связыание не удастся, будет выдано сообщение об ошибке.
when (typedAttr.TypeInfo.FullName == "Ns1.MyAttr")
Message.Hint(a.Location, $"Attribute: '$a' attr: '$attr' str: '$str' typedAttr: '$typedAttr'");
| _ => ()
}
}
}
}
using Nemerle.Collections;
using Nemerle.Text;
using Nemerle.Utility;
using System;
using System.Collections.Generic;
using System.Console;
using System.Linq;
using GetInfoFromCustomAttributeMacro;
using Ns1;
namespace Ns1
{
[Record]
public class MyAttr : Attribute
{
public AttrField : string;
}
}
namespace Ns2
{
[Record]
public class MyAttr : Attribute
{
public AttrField : string;
}
}
module Program
{
[Ns1.MyAttr("Test str"), TestMacro, MyAttr("Other string"), Ns2.MyAttr("Test str")]
field1 : int = 0;
Main() : void
{
_ = field1;
WriteLine("Hi!");
_ = ReadLine();
}
}
Main.n(33,4):Warning: hint: Attribute: 'Ns1.MyAttr("Test str")' attr: 'Ns1.MyAttr' str: 'Test str' typedAttr: 'Ns1.MyAttr'
Main.n(33,39):Warning: hint: Attribute: 'MyAttr("Other string")' attr: 'MyAttr' str: 'Other string' typedAttr: 'Ns1.MyAttr'