2 вопроса по макросам
От: Ziaw Россия  
Дата: 11.04.10 13:22
Оценка:
Как задать базовый тип у помеченного класса?
Как один и тот же макрос вызвать на разных стадиях и как узнать стадию?
... << RSDN@Home 1.2.0 alpha 4 rev. 1468>>
Re: 2 вопроса по макросам
От: _nn_ www.nemerleweb.com
Дата: 11.04.10 13:39
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Как один и тот же макрос вызвать на разных стадиях и как узнать стадию?


Можно задавать стадию.

здесь
Автор(ы): Чистяков Влад (VladD2)
Дата: 05.02.2008
В третьей части статьи о макросах Nemerle речь пойдет о разработке метаатрибутов, то есть макросов, которые выглядят как Custom-атрибуты.


[MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Parameter,
            Inherited = true, AllowMultiple = false)]
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: 2 вопроса по макросам
От: Jack128  
Дата: 11.04.10 13:57
Оценка: 12 (1)
Здравствуйте, Ziaw, Вы писали:

Z>Как задать базовый тип у помеченного класса?

Z>Как один и тот же макрос вызвать на разных стадиях и как узнать стадию?

опиши два одноименных макроса указав им разным стадии компиляции:


    [MacroUsage(MacroPhase.BeforeTypedMembers, MacroTargets.Class)]
    macro TextMacro(tb : TypeBuilder)
    {
        Message.Hint("BeforeTypedMembers");
    }
    [MacroUsage(MacroPhase.WithTypedMembers, MacroTargets.Class)]
    macro TextMacro(tb : TypeBuilder)
    {
        Message.Hint("WithTypedMembers");
    }
Re: 2 вопроса по макросам
От: Аноним  
Дата: 11.04.10 15:05
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Как задать базовый тип у помеченного класса?


Лучехше не связывать руки пользователям жестко задавая
базовый класс из макроса. Лучше добавить интерфейс, и
добавит реализацию его методов в макросе.

Добавить интерфейс можно на стадии BeforeInheritance с помощю
TypeBuilder.AddImplementedInterface().
Re[2]: 2 вопроса по макросам
От: Ziaw Россия  
Дата: 11.04.10 15:21
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Ziaw, Вы писали:


Z>>Как задать базовый тип у помеченного класса?


А>Лучехше не связывать руки пользователям жестко задавая

А>базовый класс из макроса. Лучше добавить интерфейс, и
А>добавит реализацию его методов в макросе.

А>Добавить интерфейс можно на стадии BeforeInheritance с помощю

А>TypeBuilder.AddImplementedInterface().

Мне нужен класс который станет либо DbContext'ом от linq, либо DbManager'ом от bltoolkit в зависимости от макрореференса.
Неужели в BeforeInheritance это нельзя сделать?
Можено было бы генерить весь класс, но не хочется, хочется дописывать его руками уметь.
... << RSDN@Home 1.2.0 alpha 4 rev. 1468>>
Re[3]: 2 вопроса по макросам
От: Jack128  
Дата: 11.04.10 16:59
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Можено было бы генерить весь класс, но не хочется, хочется дописывать его руками уметь.


partial class/methods для этого придумали.
Re[4]: 2 вопроса по макросам
От: Jack128  
Дата: 11.04.10 17:02
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Здравствуйте, Ziaw, Вы писали:


Z>>Можено было бы генерить весь класс, но не хочется, хочется дописывать его руками уметь.


J>partial class/methods для этого придумали.


хотя все равно — принудительное наследование — зло. не лудше композицией заменить? тогда те придется просто поле нужного типа генерить.
Re[4]: 2 вопроса по макросам
От: Ziaw Россия  
Дата: 12.04.10 00:43
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Здравствуйте, Ziaw, Вы писали:


Z>>Можено было бы генерить весь класс, но не хочется, хочется дописывать его руками уметь.


J>partial class/methods для этого придумали.


Как они решают мою проблему?
... << RSDN@Home 1.2.0 alpha 4 rev. 1468>>
Re[5]: 2 вопроса по макросам
От: Ziaw Россия  
Дата: 12.04.10 00:48
Оценка:
Здравствуйте, Jack128, Вы писали:

J>хотя все равно — принудительное наследование — зло. не лудше композицией заменить? тогда те придется просто поле нужного типа генерить.


А можно я сам буду решать, что для меня зло, а что нет? В данном случае нужнен именно наследник.
... << RSDN@Home 1.2.0 alpha 4 rev. 1468>>
Re[6]: 2 вопроса по макросам
От: Jack128  
Дата: 12.04.10 05:55
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Jack128, Вы писали:


J>>хотя все равно — принудительное наследование — зло. не лудше композицией заменить? тогда те придется просто поле нужного типа генерить.


Z>А можно я сам буду решать, что для меня зло, а что нет? В данном случае нужнен именно наследник.


Можно. Решай.
Re: 2 вопроса по макросам
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.04.10 20:14
Оценка:
Здравствуйте, Ziaw, Вы писали:

Добавил поле UserData и события CompilationStart, TypeTreeBuildFinish в Manager.

Свойство UserData — это словарь который обнуляется перед компиляцией.

Как использовать свойство UserData и событие TypeTreeBuildFinish смотри в тестах:

http://nemerle.googlecode.com/svn/nemerle/trunk/ncc/testsuite/positive/CompilerEventsMacroLib.n http://nemerle.googlecode.com/svn/nemerle/trunk/ncc/testsuite/positive/CompilerEventsTest.n
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.