Создание фабричного метода.
От: Dufrenite Дания  
Дата: 09.09.07 10:53
Оценка:
Требуется сгенерировать статический метод, который возвращает объект типа, с которым работает макрос. Вопрос: как это лучше сделать. Вот код на котором я остановился (здесь выполняется десериализация полей из BinaryReader):

        internal СоздатьМетодДесериализации(
            поля : list[IField],
            атрибуты : NemerleAttributes,
            конструктор : IMethod
            ) : ClassMember
        {
            def проанализироватьПоля(поле : IField, acc)
            {
                def имя = Macros.UseSiteSymbol(поле.Name);
                <[ def $(имя : name) = reader.ReadInt32() ]> :: acc;
            };

            Message.Hint($"$(конструктор.Name)");
            Message.Hint($"$(конструктор.Header.ParametersReferences)");
            def загрузки = поля.FoldLeft([], проанализироватьПоля).Reverse();
            def телоМетода = <[{..$загрузки }]>;
            def атрибуты = Modifiers(атрибуты %| NemerleAttributes.Static, []);
            <[decl: ..$атрибуты Загрузить(reader : System.IO.BinaryReader) : void $телоМетода ]>
        }


Для такого вызова


[BinarySerializableRecord]
internal sealed class Класс1
{
    private _поле1 : int;
}


генерируется следующий код:


[BinarySerializable]
internal sealed class Класс1
{
    private _поле1 : int;

    internal this(_поле1 : int)
    {
        this._поле1 = _поле1;
    }

    internal static Загрузить(reader : System.IO.BinaryReader) : void
    {
        def _поле1 = reader.ReadInt32();
    }
}


Вопрос: как сделать, чтобы в качестве возвращаемого значения был Класс1, и в конце вызывался передаваемый конструктор?


internal static Загрузить(reader : System.IO.BinaryReader) : Класс1
{
    def _поле1 = reader.ReadInt32();
    Класс1(_поле1)
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.